Update API queries to include new fields
This commit is contained in:
		| @@ -1,114 +1,324 @@ | ||||
| <template> | ||||
|   <Filters :report-button="true" @reset-form="data = []" @run-search="() => filterData(filters)" class="mb-4"> | ||||
|   <Filters | ||||
|     :report-button="true" | ||||
|     @reset-form="data = []" | ||||
|     @run-search="() => filterData(filters)" | ||||
|     class="mb-4" | ||||
|   > | ||||
|     <Type2 @update:filters="(value) => (filters = value)" /> | ||||
|   </Filters> | ||||
|  | ||||
|   <div id="data"> | ||||
|     <DxDataGrid ref="dataGridRef" :allow-column-reordering="true" class="max-h-[calc(100vh-140px)] mb-10" | ||||
|       :data-source="data" :show-column-lines="true" :show-row-lines="false" :show-borders="true" | ||||
|       :row-alternation-enabled="true" :hover-state-enabled="true" @selection-changed="onDataSelectionChanged" | ||||
|       @exporting="onExporting" :allow-column-resizing="true" column-resizing-mode="widget" :word-wrap-enabled="true"> | ||||
|     <DxDataGrid | ||||
|       ref="dataGridRef" | ||||
|       :allow-column-reordering="true" | ||||
|       class="max-h-[calc(100vh-140px)] mb-10" | ||||
|       :data-source="data" | ||||
|       :show-column-lines="true" | ||||
|       :show-row-lines="false" | ||||
|       :show-borders="true" | ||||
|       :row-alternation-enabled="true" | ||||
|       :hover-state-enabled="true" | ||||
|       @selection-changed="onDataSelectionChanged" | ||||
|       @exporting="onExporting" | ||||
|       :allow-column-resizing="true" | ||||
|       column-resizing-mode="widget" | ||||
|       :word-wrap-enabled="true" | ||||
|     > | ||||
|       <DxGrouping expand-mode="rowClick" /> | ||||
|       <DxSelection mode="single" /> | ||||
|       <DxPaging :enabled="false" /> | ||||
|       <DxScrolling column-rendering-mode="virtual" mode="virtual" /> | ||||
|       <DxLoadPanel shading-color="rgba(0,0,0,0.4)" :position="position" :show-indicator="showIndicator" | ||||
|         :show-pane="showPane" :shading="shading" v-model:visible="loadingData" :enabled="true" /> | ||||
|       <DxLoadPanel | ||||
|         shading-color="rgba(0,0,0,0.4)" | ||||
|         :position="position" | ||||
|         :show-indicator="showIndicator" | ||||
|         :show-pane="showPane" | ||||
|         :shading="shading" | ||||
|         v-model:visible="loadingData" | ||||
|         :enabled="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" /> | ||||
|  | ||||
|       <DxColumn alignment="center" :caption="`Periode: ${getMonthName(currentMonth)}, ${currentYear}`" | ||||
|         css-class="custom-table-column"> | ||||
|         <DxColumn alignment="center" :min-width="170" data-type="text" data-field="nama_regional" | ||||
|           caption="Nama Regional" css-class="custom-table-column" :group-index="0" /> | ||||
|         <DxColumn alignment="center" :min-width="170" data-type="text" data-field="nama_uid" caption="Nama UID" | ||||
|           css-class="custom-table-column" :group-index="1" /> | ||||
|         <DxColumn alignment="center" :min-width="170" data-type="text" data-field="nama_up3" caption="Nama UP3" | ||||
|           css-class="custom-table-column" :group-index="2" /> | ||||
|         <DxColumn alignment="center" :min-width="170" data-type="text" data-field="na  ma_ulp" caption="Nama Unit" | ||||
|           css-class="custom-table-column" name="namaULP" cell-template="formatText" /> | ||||
|       <DxColumn | ||||
|         alignment="center" | ||||
|         :caption="`Periode: ${getMonthName(currentMonth)}, ${currentYear}`" | ||||
|         css-class="custom-table-column" | ||||
|       > | ||||
|         <DxColumn | ||||
|           alignment="center" | ||||
|           :min-width="170" | ||||
|           data-type="text" | ||||
|           data-field="nama_regional" | ||||
|           caption="Nama Regional" | ||||
|           css-class="custom-table-column" | ||||
|           :group-index="0" | ||||
|         /> | ||||
|         <DxColumn | ||||
|           alignment="center" | ||||
|           :min-width="170" | ||||
|           data-type="text" | ||||
|           data-field="nama_uid" | ||||
|           caption="Nama UID" | ||||
|           css-class="custom-table-column" | ||||
|           :group-index="1" | ||||
|         /> | ||||
|         <DxColumn | ||||
|           alignment="center" | ||||
|           :min-width="170" | ||||
|           data-type="text" | ||||
|           data-field="nama_up3" | ||||
|           caption="Nama UP3" | ||||
|           css-class="custom-table-column" | ||||
|           :group-index="2" | ||||
|         /> | ||||
|         <DxColumn | ||||
|           alignment="center" | ||||
|           :min-width="170" | ||||
|           data-type="text" | ||||
|           data-field="na  ma_ulp" | ||||
|           caption="Nama Unit" | ||||
|           css-class="custom-table-column" | ||||
|           name="namaULP" | ||||
|           cell-template="formatText" | ||||
|         /> | ||||
|       </DxColumn> | ||||
|       <DxColumn alignment="center" caption="Aging Complains" css-class="custom-table-column"> | ||||
|         <DxColumn alignment="center" caption="Rata-Rata RCT Gangguan" css-class="custom-table-column"> | ||||
|           <DxColumn :width="150" alignment="center" data-field="avg_durasi_recovery_gangguan" data-type="number" | ||||
|             :caption="`${getMonthNameShort(currentMonth)} ${currentYear}`" css-class="custom-table-column" | ||||
|             cell-template="formatNumber" /> | ||||
|           <DxColumn :width="150" alignment="center" data-field="sla_gangguan" data-type="number" caption="SLA (Menit)" | ||||
|             css-class="custom-table-column" cell-template="formatNumber" /> | ||||
|         <DxColumn | ||||
|           alignment="center" | ||||
|           caption="Rata-Rata RCT Gangguan" | ||||
|           css-class="custom-table-column" | ||||
|         > | ||||
|           <DxColumn | ||||
|             :width="150" | ||||
|             alignment="center" | ||||
|             data-field="avg_durasi_recovery_gangguan" | ||||
|             data-type="number" | ||||
|             :caption="`${getMonthNameShort(currentMonth)} ${currentYear}`" | ||||
|             css-class="custom-table-column" | ||||
|             cell-template="formatNumber" | ||||
|           /> | ||||
|           <DxColumn | ||||
|             :width="150" | ||||
|             alignment="center" | ||||
|             data-field="sla_gangguan" | ||||
|             data-type="number" | ||||
|             caption="SLA (Menit)" | ||||
|             css-class="custom-table-column" | ||||
|             cell-template="formatNumber" | ||||
|           /> | ||||
|         </DxColumn> | ||||
|         <DxColumn alignment="center" caption="Rata-Rata RCT Keluhan" css-class="custom-table-column"> | ||||
|           <DxColumn :width="150" alignment="center" data-field="avg_durasi_recovery_keluhan" data-type="number" | ||||
|             :caption="`${getMonthNameShort(currentMonth)} ${currentYear}`" css-class="custom-table-column" | ||||
|             cell-template="formatNumber" /> | ||||
|           <DxColumn :width="150" alignment="center" data-field="sla_keluhan" data-type="number" caption="SLA (Jam)" | ||||
|             css-class="custom-table-column" cell-template="formatNumber" /> | ||||
|         <DxColumn | ||||
|           alignment="center" | ||||
|           caption="Rata-Rata RCT Keluhan" | ||||
|           css-class="custom-table-column" | ||||
|         > | ||||
|           <DxColumn | ||||
|             :width="150" | ||||
|             alignment="center" | ||||
|             data-field="avg_durasi_recovery_keluhan" | ||||
|             data-type="number" | ||||
|             :caption="`${getMonthNameShort(currentMonth)} ${currentYear}`" | ||||
|             css-class="custom-table-column" | ||||
|             cell-template="formatNumber" | ||||
|           /> | ||||
|           <DxColumn | ||||
|             :width="150" | ||||
|             alignment="center" | ||||
|             data-field="sla_keluhan" | ||||
|             data-type="number" | ||||
|             caption="SLA (Jam)" | ||||
|             css-class="custom-table-column" | ||||
|             cell-template="formatNumber" | ||||
|           /> | ||||
|         </DxColumn> | ||||
|       </DxColumn> | ||||
|       <DxColumn alignment="center" caption="% Aging Complains" css-class="custom-table-column"> | ||||
|         <DxColumn :width="150" alignment="center" data-field="aging_complaint_gangguan" data-type="number" caption="G" | ||||
|           css-class="custom-table-column" cell-template="formatPercentage" /> | ||||
|         <DxColumn :width="150" alignment="center" data-field="aging_complaint_keluhan" data-type="number" caption="K" | ||||
|           css-class="custom-table-column" cell-template="formatPercentage" /> | ||||
|         <DxColumn | ||||
|           :width="150" | ||||
|           alignment="center" | ||||
|           data-field="aging_complaint_gangguan" | ||||
|           data-type="number" | ||||
|           caption="G" | ||||
|           css-class="custom-table-column" | ||||
|           cell-template="formatPercentage" | ||||
|         /> | ||||
|         <DxColumn | ||||
|           :width="150" | ||||
|           alignment="center" | ||||
|           data-field="aging_complaint_keluhan" | ||||
|           data-type="number" | ||||
|           caption="K" | ||||
|           css-class="custom-table-column" | ||||
|           cell-template="formatPercentage" | ||||
|         /> | ||||
|       </DxColumn> | ||||
|       <DxColumn :min-width="170" alignment="center" data-field="avg_aging_complaint" data-type="number" | ||||
|         caption="% Rata-Rata Aging Complains" css-class="custom-table-column" cell-template="formatPercentage" /> | ||||
|       <DxColumn | ||||
|         :min-width="170" | ||||
|         alignment="center" | ||||
|         data-field="avg_aging_complaint" | ||||
|         data-type="number" | ||||
|         caption="% Rata-Rata Aging Complains" | ||||
|         css-class="custom-table-column" | ||||
|         cell-template="formatPercentage" | ||||
|       /> | ||||
|  | ||||
|       <DxSummary> | ||||
|         <DxTotalItem summary-type="sum" display-format="RATA-RATA NASIONAL" show-in-column="nama_ulp" | ||||
|           css-class="text-white !text-left" /> | ||||
|         <DxTotalItem column="avg_durasi_recovery_gangguan" summary-type="sum" display-format="{0}" | ||||
|           css-class="text-white !text-right" :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxTotalItem column="sla_gangguan" summary-type="sum" display-format="{0}" css-class="text-white !text-right" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxTotalItem column="avg_durasi_recovery_keluhan" summary-type="sum" display-format="{0}" | ||||
|           css-class="text-white !text-right" :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxTotalItem column="sla_keluhan" summary-type="sum" display-format="{0}" css-class="text-white !text-right" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxTotalItem column="aging_complaint_gangguan" summary-type="avg" display-format="{0}" | ||||
|           css-class="text-white !text-right" :customize-text="(e: any) => (parseFloat(e.value.toString()) ? formatPercentage(e.value) : '0%') | ||||
|     " /> | ||||
|         <DxTotalItem column="aging_complaint_keluhan" summary-type="avg" display-format="{0}" | ||||
|           css-class="text-white !text-right" :customize-text="(e: any) => (parseFloat(e.value.toString()) ? formatPercentage(e.value) : '0%') | ||||
|     " /> | ||||
|         <DxTotalItem column="avg_aging_complaint" summary-type="avg" display-format="{0}" | ||||
|           css-class="text-white !text-right" :customize-text="(e: any) => (parseFloat(e.value.toString()) ? formatPercentage(e.value) : '0%') | ||||
|     " /> | ||||
|         <DxTotalItem | ||||
|           summary-type="sum" | ||||
|           display-format="RATA-RATA NASIONAL" | ||||
|           show-in-column="nama_ulp" | ||||
|           css-class="text-white !text-left" | ||||
|         /> | ||||
|         <DxTotalItem | ||||
|           column="avg_durasi_recovery_gangguan" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           css-class="text-white !text-right" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|         <DxTotalItem | ||||
|           column="sla_gangguan" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           css-class="text-white !text-right" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|         <DxTotalItem | ||||
|           column="avg_durasi_recovery_keluhan" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           css-class="text-white !text-right" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|         <DxTotalItem | ||||
|           column="sla_keluhan" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           css-class="text-white !text-right" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|         <DxTotalItem | ||||
|           column="aging_complaint_gangguan" | ||||
|           summary-type="avg" | ||||
|           display-format="{0}" | ||||
|           css-class="text-white !text-right" | ||||
|           :customize-text=" | ||||
|             (e: any) => (parseFloat(e.value.toString()) ? formatPercentage(e.value) : '0%') | ||||
|           " | ||||
|         /> | ||||
|         <DxTotalItem | ||||
|           column="aging_complaint_keluhan" | ||||
|           summary-type="avg" | ||||
|           display-format="{0}" | ||||
|           css-class="text-white !text-right" | ||||
|           :customize-text=" | ||||
|             (e: any) => (parseFloat(e.value.toString()) ? formatPercentage(e.value) : '0%') | ||||
|           " | ||||
|         /> | ||||
|         <DxTotalItem | ||||
|           column="avg_aging_complaint" | ||||
|           summary-type="avg" | ||||
|           display-format="{0}" | ||||
|           css-class="text-white !text-right" | ||||
|           :customize-text=" | ||||
|             (e: any) => (parseFloat(e.value.toString()) ? formatPercentage(e.value) : '0%') | ||||
|           " | ||||
|         /> | ||||
|  | ||||
|         <DxGroupItem css-class="!text-right" show-in-column="avg_durasi_recovery_gangguan" :show-in-group-footer="false" | ||||
|           :align-by-column="true" column="avg_durasi_recovery_gangguan" summary-type="sum" display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxGroupItem css-class="!text-right" show-in-column="sla_gangguan" :show-in-group-footer="false" | ||||
|           :align-by-column="true" column="sla_gangguan" summary-type="sum" display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxGroupItem css-class="!text-right" show-in-column="avg_durasi_recovery_keluhan" :show-in-group-footer="false" | ||||
|           :align-by-column="true" column="avg_durasi_recovery_keluhan" summary-type="sum" display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxGroupItem css-class="!text-right" show-in-column="sla_keluhan" :show-in-group-footer="false" | ||||
|           :align-by-column="true" column="sla_keluhan" summary-type="sum" display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxGroupItem css-class="!text-right" show-in-column="aging_complaint_gangguan" :show-in-group-footer="false" | ||||
|           :align-by-column="true" column="aging_complaint_gangguan" summary-type="avg" display-format="{0}" | ||||
|           :customize-text="(e: any) => (parseFloat(e.value.toString()) ? formatPercentage(e.value) : '0%') | ||||
|     " /> | ||||
|         <DxGroupItem css-class="!text-right" show-in-column="aging_complaint_keluhan" :show-in-group-footer="false" | ||||
|           :align-by-column="true" column="aging_complaint_keluhan" summary-type="avg" display-format="{0}" | ||||
|           :customize-text="(e: any) => (parseFloat(e.value.toString()) ? formatPercentage(e.value) : '0%') | ||||
|     " /> | ||||
|         <DxGroupItem css-class="!text-right" show-in-column="avg_aging_complaint" :show-in-group-footer="false" | ||||
|           :align-by-column="true" column="avg_aging_complaint" summary-type="avg" display-format="{0}" :customize-text="(e: any) => (parseFloat(e.value.toString()) ? formatPercentage(e.value) : '0%') | ||||
|     " /> | ||||
|         <DxGroupItem | ||||
|           css-class="!text-right" | ||||
|           show-in-column="avg_durasi_recovery_gangguan" | ||||
|           :show-in-group-footer="false" | ||||
|           :align-by-column="true" | ||||
|           column="avg_durasi_recovery_gangguan" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|         <DxGroupItem | ||||
|           css-class="!text-right" | ||||
|           show-in-column="sla_gangguan" | ||||
|           :show-in-group-footer="false" | ||||
|           :align-by-column="true" | ||||
|           column="sla_gangguan" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|         <DxGroupItem | ||||
|           css-class="!text-right" | ||||
|           show-in-column="avg_durasi_recovery_keluhan" | ||||
|           :show-in-group-footer="false" | ||||
|           :align-by-column="true" | ||||
|           column="avg_durasi_recovery_keluhan" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|         <DxGroupItem | ||||
|           css-class="!text-right" | ||||
|           show-in-column="sla_keluhan" | ||||
|           :show-in-group-footer="false" | ||||
|           :align-by-column="true" | ||||
|           column="sla_keluhan" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|         <DxGroupItem | ||||
|           css-class="!text-right" | ||||
|           show-in-column="aging_complaint_gangguan" | ||||
|           :show-in-group-footer="false" | ||||
|           :align-by-column="true" | ||||
|           column="aging_complaint_gangguan" | ||||
|           summary-type="avg" | ||||
|           display-format="{0}" | ||||
|           :customize-text=" | ||||
|             (e: any) => (parseFloat(e.value.toString()) ? formatPercentage(e.value) : '0%') | ||||
|           " | ||||
|         /> | ||||
|         <DxGroupItem | ||||
|           css-class="!text-right" | ||||
|           show-in-column="aging_complaint_keluhan" | ||||
|           :show-in-group-footer="false" | ||||
|           :align-by-column="true" | ||||
|           column="aging_complaint_keluhan" | ||||
|           summary-type="avg" | ||||
|           display-format="{0}" | ||||
|           :customize-text=" | ||||
|             (e: any) => (parseFloat(e.value.toString()) ? formatPercentage(e.value) : '0%') | ||||
|           " | ||||
|         /> | ||||
|         <DxGroupItem | ||||
|           css-class="!text-right" | ||||
|           show-in-column="avg_aging_complaint" | ||||
|           :show-in-group-footer="false" | ||||
|           :align-by-column="true" | ||||
|           column="avg_aging_complaint" | ||||
|           summary-type="avg" | ||||
|           display-format="{0}" | ||||
|           :customize-text=" | ||||
|             (e: any) => (parseFloat(e.value.toString()) ? formatPercentage(e.value) : '0%') | ||||
|           " | ||||
|         /> | ||||
|       </DxSummary> | ||||
|  | ||||
|       <template #formatNumber="{ data }"> | ||||
|         <p class="text-right cursor-pointer"> | ||||
|           {{ | ||||
|     isNumber(data.text) | ||||
|       ? data.column.caption == '%' | ||||
|         ? formatPercentage(data.text) | ||||
|         : formatNumber(data.text) | ||||
|       : data.text | ||||
|   }} | ||||
|             isNumber(data.text) | ||||
|               ? data.column.caption == '%' | ||||
|                 ? formatPercentage(data.text) | ||||
|                 : formatNumber(data.text) | ||||
|               : data.text | ||||
|           }} | ||||
|         </p> | ||||
|       </template> | ||||
|  | ||||
| @@ -126,68 +336,212 @@ | ||||
|     </DxDataGrid> | ||||
|   </div> | ||||
|  | ||||
|   <DetailDialog :open="dialogDetail" title="Detail (Monalisa) Aging Complaint" @on-close="closedialogDetail" | ||||
|     :full-width="true"> | ||||
|   <DetailDialog | ||||
|     :open="dialogDetail" | ||||
|     title="Detail (Monalisa) Aging Complaint" | ||||
|     @on-close="closedialogDetail" | ||||
|     :full-width="true" | ||||
|   > | ||||
|     <div class="w-full mb-4 lg:w-[70%] lg:float-left"> | ||||
|       <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" | ||||
|           :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="onExporting" :allow-column-resizing="true" column-resizing-mode="widget"> | ||||
|         <DxDataGrid | ||||
|           :allow-column-reordering="true" | ||||
|           class="max-h-[calc(100vh-140px)]" | ||||
|           :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="onExporting" | ||||
|           :allow-column-resizing="true" | ||||
|           column-resizing-mode="widget" | ||||
|         > | ||||
|           <DxSelection mode="single" /> | ||||
|           <DxPaging :page-size="20" :enabled="true" /> | ||||
|           <DxPager :visible="true" :allowed-page-sizes="[20, 50, 100]" display-mode="full" | ||||
|             :show-page-size-selector="true" :show-info="true" :show-navigation-buttons="true" /> | ||||
|           <DxLoadPanel shading-color="rgba(0,0,0,0.4)" :position="position" :show-indicator="showIndicator" | ||||
|             :show-pane="showPane" :shading="shading" v-model:visible="loadingSubData" :enabled="true" /> | ||||
|           <DxPager | ||||
|             :visible="true" | ||||
|             :allowed-page-sizes="[20, 50, 100]" | ||||
|             display-mode="full" | ||||
|             :show-page-size-selector="true" | ||||
|             :show-info="true" | ||||
|             :show-navigation-buttons="true" | ||||
|           /> | ||||
|           <DxLoadPanel | ||||
|             shading-color="rgba(0,0,0,0.4)" | ||||
|             :position="position" | ||||
|             :show-indicator="showIndicator" | ||||
|             :show-pane="showPane" | ||||
|             :shading="shading" | ||||
|             v-model:visible="loadingSubData" | ||||
|             :enabled="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" | ||||
|             :calculateCellValue="(item: any) => dataSub.findIndex((i) => i == item) + 1" data-type="number" caption="No" | ||||
|             cell-template="formatNumber" /> | ||||
|           <DxColumn :width="150" alignment="center" data-field="no_laporan" caption="No Laporan" :allow-resizing="false" | ||||
|             css-class="custom-table-column" cell-template="formatText" /> | ||||
|           <DxColumn :width="150" alignment="center" data-field="" caption="UID/UIW" :allow-resizing="false" | ||||
|             css-class="custom-table-column" cell-template="formatText" /> | ||||
|           <DxColumn :width="150" alignment="center" data-field="" caption="UP3" :allow-resizing="false" | ||||
|             css-class="custom-table-column" cell-template="formatText" /> | ||||
|           <DxColumn :width="150" alignment="center" data-field="" caption="ULP" :allow-resizing="false" | ||||
|             css-class="custom-table-column" cell-template="formatText" /> | ||||
|           <DxColumn :width="150" alignment="center" data-field="" caption="ID Pelanggan" :allow-resizing="false" | ||||
|             css-class="custom-table-column" cell-template="formatNumber" /> | ||||
|           <DxColumn :width="150" data-field="" caption="Nama Pelanggan" :allow-resizing="false" | ||||
|             css-class="custom-table-column" cell-template="formatText" /> | ||||
|           <DxColumn :width="150" data-field="" caption="Nama Pelapor" :allow-resizing="false" | ||||
|             css-class="custom-table-column" cell-template="formatText" /> | ||||
|           <DxColumn :width="150" data-field="" caption="Alamat Pelapor" :allow-resizing="false" | ||||
|             css-class="custom-table-column" cell-template="formatText" /> | ||||
|           <DxColumn :width="150" data-field="" caption="No Telp Pelapor" :allow-resizing="false" | ||||
|             css-class="custom-table-column" cell-template="formatText" /> | ||||
|           <DxColumn :width="150" data-field="" caption="Keterangan Pelapor" :allow-resizing="false" | ||||
|             css-class="custom-table-column" cell-template="formatText" /> | ||||
|           <DxColumn :width="150" data-field="" caption="Penyebab" :allow-resizing="false" | ||||
|             css-class="custom-table-column" cell-template="formatText" /> | ||||
|           <DxColumn :width="150" alignment="center" data-field="" caption="Kode Gangguan" :allow-resizing="false" | ||||
|             css-class="custom-table-column" cell-template="formatText" /> | ||||
|           <DxColumn :width="150" alignment="center" data-field="" caption="Jenis Gangguan" :allow-resizing="false" | ||||
|             css-class="custom-table-column" cell-template="formatText" /> | ||||
|           <DxColumn :width="150" alignment="center" data-field="" caption="Durasi Response Time" :allow-resizing="false" | ||||
|             css-class="custom-table-column" cell-template="formatText" /> | ||||
|           <DxColumn :width="150" alignment="center" data-field="" caption="Durasi Recovery Time" :allow-resizing="false" | ||||
|             css-class="custom-table-column" cell-template="formatText" /> | ||||
|           <DxColumn :width="150" alignment="center" data-field="" caption="Tgl Lapor" :allow-resizing="false" | ||||
|             css-class="custom-table-column" cell-template="formatText" /> | ||||
|           <DxColumn | ||||
|             css-class="custom-table-column" | ||||
|             :width="50" | ||||
|             alignment="center" | ||||
|             :calculateCellValue="(item: any) => dataSub.findIndex((i) => i == item) + 1" | ||||
|             data-type="number" | ||||
|             caption="No" | ||||
|             cell-template="formatNumber" | ||||
|           /> | ||||
|           <DxColumn | ||||
|             :width="150" | ||||
|             alignment="center" | ||||
|             data-field="no_laporan" | ||||
|             caption="No Laporan" | ||||
|             :allow-resizing="false" | ||||
|             css-class="custom-table-column" | ||||
|             cell-template="formatText" | ||||
|           /> | ||||
|           <DxColumn | ||||
|             :width="150" | ||||
|             alignment="center" | ||||
|             data-field="" | ||||
|             caption="UID/UIW" | ||||
|             :allow-resizing="false" | ||||
|             css-class="custom-table-column" | ||||
|             cell-template="formatText" | ||||
|           /> | ||||
|           <DxColumn | ||||
|             :width="150" | ||||
|             alignment="center" | ||||
|             data-field="" | ||||
|             caption="UP3" | ||||
|             :allow-resizing="false" | ||||
|             css-class="custom-table-column" | ||||
|             cell-template="formatText" | ||||
|           /> | ||||
|           <DxColumn | ||||
|             :width="150" | ||||
|             alignment="center" | ||||
|             data-field="" | ||||
|             caption="ULP" | ||||
|             :allow-resizing="false" | ||||
|             css-class="custom-table-column" | ||||
|             cell-template="formatText" | ||||
|           /> | ||||
|           <DxColumn | ||||
|             :width="150" | ||||
|             alignment="center" | ||||
|             data-field="" | ||||
|             caption="ID Pelanggan" | ||||
|             :allow-resizing="false" | ||||
|             css-class="custom-table-column" | ||||
|             cell-template="formatNumber" | ||||
|           /> | ||||
|           <DxColumn | ||||
|             :width="150" | ||||
|             data-field="" | ||||
|             caption="Nama Pelanggan" | ||||
|             :allow-resizing="false" | ||||
|             css-class="custom-table-column" | ||||
|             cell-template="formatText" | ||||
|           /> | ||||
|           <DxColumn | ||||
|             :width="150" | ||||
|             data-field="" | ||||
|             caption="Nama Pelapor" | ||||
|             :allow-resizing="false" | ||||
|             css-class="custom-table-column" | ||||
|             cell-template="formatText" | ||||
|           /> | ||||
|           <DxColumn | ||||
|             :width="150" | ||||
|             data-field="" | ||||
|             caption="Alamat Pelapor" | ||||
|             :allow-resizing="false" | ||||
|             css-class="custom-table-column" | ||||
|             cell-template="formatText" | ||||
|           /> | ||||
|           <DxColumn | ||||
|             :width="150" | ||||
|             data-field="" | ||||
|             caption="No Telp Pelapor" | ||||
|             :allow-resizing="false" | ||||
|             css-class="custom-table-column" | ||||
|             cell-template="formatText" | ||||
|           /> | ||||
|           <DxColumn | ||||
|             :width="150" | ||||
|             data-field="" | ||||
|             caption="Keterangan Pelapor" | ||||
|             :allow-resizing="false" | ||||
|             css-class="custom-table-column" | ||||
|             cell-template="formatText" | ||||
|           /> | ||||
|           <DxColumn | ||||
|             :width="150" | ||||
|             data-field="" | ||||
|             caption="Penyebab" | ||||
|             :allow-resizing="false" | ||||
|             css-class="custom-table-column" | ||||
|             cell-template="formatText" | ||||
|           /> | ||||
|           <DxColumn | ||||
|             :width="150" | ||||
|             alignment="center" | ||||
|             data-field="" | ||||
|             caption="Kode Gangguan" | ||||
|             :allow-resizing="false" | ||||
|             css-class="custom-table-column" | ||||
|             cell-template="formatText" | ||||
|           /> | ||||
|           <DxColumn | ||||
|             :width="150" | ||||
|             alignment="center" | ||||
|             data-field="" | ||||
|             caption="Jenis Gangguan" | ||||
|             :allow-resizing="false" | ||||
|             css-class="custom-table-column" | ||||
|             cell-template="formatText" | ||||
|           /> | ||||
|           <DxColumn | ||||
|             :width="150" | ||||
|             alignment="center" | ||||
|             data-field="" | ||||
|             caption="Durasi Response Time" | ||||
|             :allow-resizing="false" | ||||
|             css-class="custom-table-column" | ||||
|             cell-template="formatText" | ||||
|           /> | ||||
|           <DxColumn | ||||
|             :width="150" | ||||
|             alignment="center" | ||||
|             data-field="" | ||||
|             caption="Durasi Recovery Time" | ||||
|             :allow-resizing="false" | ||||
|             css-class="custom-table-column" | ||||
|             cell-template="formatText" | ||||
|           /> | ||||
|           <DxColumn | ||||
|             :width="150" | ||||
|             alignment="center" | ||||
|             data-field="" | ||||
|             caption="Tgl Lapor" | ||||
|             :allow-resizing="false" | ||||
|             css-class="custom-table-column" | ||||
|             cell-template="formatText" | ||||
|           /> | ||||
|  | ||||
|           <template #formatNumber="{ data }"> | ||||
|             <p class="text-right cursor-pointer"> | ||||
|               {{ | ||||
|     isNumber(data.text) | ||||
|       ? data.column.caption == '%' | ||||
|         ? formatPercentage(data.text) | ||||
|         : formatNumber(data.text) | ||||
|       : data.text | ||||
|   }} | ||||
|                 isNumber(data.text) | ||||
|                   ? data.column.caption == '%' | ||||
|                     ? formatPercentage(data.text) | ||||
|                     : formatNumber(data.text) | ||||
|                   : data.text | ||||
|               }} | ||||
|             </p> | ||||
|           </template> | ||||
|  | ||||
| @@ -292,7 +646,7 @@ | ||||
| </template> | ||||
|  | ||||
| <script setup lang="ts"> | ||||
| import { onMounted, ref } from 'vue' | ||||
| import { onMounted, ref, watch } from 'vue' | ||||
| import Filters from '@/components/Form/Filters.vue' | ||||
| import Type2 from '@/components/Form/FiltersType/Type2.vue' | ||||
| import { DxDataGrid } from 'devextreme-vue' | ||||
| @@ -321,7 +675,11 @@ import { getMonthName, getMonthNameShort } from '@/utils/texts' | ||||
| import { formatNumber, formatPercentage, isNumber } from '@/utils/numbers' | ||||
| import DetailDialog from '@/components/Dialogs/DetailDialog.vue' | ||||
| import InputText from '@/components/InputText.vue' | ||||
| import { apolloClient } from '@/utils/api/api.graphql' | ||||
| import { provideApolloClient } from '@vue/apollo-composable' | ||||
|  | ||||
| const client = apolloClient() | ||||
| provideApolloClient(client) | ||||
| const currentYear = ref(new Date().getFullYear()) | ||||
| const currentMonth = ref(new Date().getMonth()) | ||||
| const lastYear = ref(currentYear.value - 1) | ||||
| @@ -369,32 +727,39 @@ const onExporting = (e: any) => { | ||||
| } | ||||
|  | ||||
| const getDetail = () => { | ||||
|   // loadingSubData.value = true | ||||
|  | ||||
|   const dateValue = filters.value.periode.split(' s/d ') | ||||
|   const ref = dataSelected.value | ||||
|   const query = {} | ||||
|   const selected = dataSelected.value | ||||
|  | ||||
|   // const { onResult, onError, loading, refetch } = useQuery( | ||||
|   //   queries.gangguan.rekap.gangguanAllDetail, | ||||
|   //   query | ||||
|   // ) | ||||
|   const query = { | ||||
|     dateFrom: dateValue[0] | ||||
|       ? dateValue[0].split('-').reverse().join('-') | ||||
|       : new Date().toISOString().slice(0, 10), | ||||
|     dateTo: dateValue[1] | ||||
|       ? dateValue[1].split('-').reverse().join('-') | ||||
|       : new Date().toISOString().slice(0, 10), | ||||
|     idUlp: selected?.id_ulp ? selected?.id_ulp : 0, | ||||
|     idUid: selected?.id_uid ? selected?.id_uid : 0, | ||||
|     idUp3: selected?.id_up3 ? selected?.id_up3 : 0 | ||||
|   } | ||||
|  | ||||
|   // refetch(query) | ||||
|   const { onResult, onError, loading } = useQuery( | ||||
|     queries.keluhan.rekap.rekapKeluhanAllDetail, | ||||
|     query | ||||
|   ) | ||||
|  | ||||
|   // onResult((queryResult) => { | ||||
|   //   if (queryResult.data != undefined) { | ||||
|   // dataSub.value = queryResult.data.detailGangguan | ||||
|   //   } | ||||
|   // }) | ||||
|   onResult((queryResult) => { | ||||
|     if (queryResult.data != undefined) { | ||||
|       dataSub.value = queryResult.data.detailKeluhanAll | ||||
|     } | ||||
|   }) | ||||
|  | ||||
|   // onError((error) => { | ||||
|   //   console.log(error) | ||||
|   // }) | ||||
|   onError((error) => { | ||||
|     console.log(error) | ||||
|   }) | ||||
|  | ||||
|   // watch(loading, (value) => { | ||||
|   //   loadingSubData.value = value | ||||
|   // }) | ||||
|   watch(loading, (value) => { | ||||
|     loadingSubData.value = value | ||||
|   }) | ||||
| } | ||||
|  | ||||
| const dataGridRef = ref<DxDataGrid | null>(null) | ||||
| @@ -404,7 +769,6 @@ const clearSelection = () => { | ||||
| } | ||||
| const showDetail = () => { | ||||
|   clearSelection() | ||||
|   dataSub.value = [] | ||||
|   dataSubSelected.value = null | ||||
|   dialogDetail.value = true | ||||
|   getDetail() | ||||
| @@ -413,8 +777,8 @@ const showDetail = () => { | ||||
| const onDataSelectionChanged = ({ selectedRowsData }: any) => { | ||||
|   if (selectedRowsData[0] != undefined) { | ||||
|     dataSelected.value = selectedRowsData[0] | ||||
|     showDetail() | ||||
|   } | ||||
|   showDetail() | ||||
| } | ||||
|  | ||||
| const onDataSubSelectionChanged = ({ selectedRowsData }: any) => { | ||||
| @@ -422,18 +786,6 @@ const onDataSubSelectionChanged = ({ selectedRowsData }: any) => { | ||||
|   dataSubSelected.value = data | ||||
| } | ||||
|  | ||||
| const { onResult, onError, loading, refetch } = useQuery( | ||||
|   queries.monalisa.laporan.bulanan.agingComplaintBulanan, | ||||
|   { | ||||
|     // regional: 0, | ||||
|     idUp3: 0, | ||||
|     idUid: 0, | ||||
|     idUlp: 0, | ||||
|     bulan: currentMonth.value, | ||||
|     tahun: currentYear.value | ||||
|   } | ||||
| ) | ||||
|  | ||||
| const filterData = (params: any) => { | ||||
|   const { regional, ulp, uid, up3, bulan, tahun } = params | ||||
|  | ||||
| @@ -441,26 +793,31 @@ const filterData = (params: any) => { | ||||
|   currentYear.value = tahun.id | ||||
|   lastYear.value = tahun.id - 1 | ||||
|  | ||||
|   refetch({ | ||||
|     // regional: regional, | ||||
|     idUid: uid ? uid.id : 0, | ||||
|     idUp3: up3 ? up3.id : 0, | ||||
|     idUlp: ulp ? ulp.id : 0, | ||||
|     bulan: bulan ? bulan.id : currentMonth.value, | ||||
|     tahun: bulan ? tahun.id : currentYear.value | ||||
|   }) | ||||
|   const { onResult, onError, loading, refetch } = useQuery( | ||||
|     queries.monalisa.laporan.bulanan.agingComplaintBulanan, | ||||
|     { | ||||
|       namaRegional: regional.name == 'Semua Regional' ? '' : regional.name, | ||||
|       idUid: uid ? uid.id : 0, | ||||
|       idUp3: up3 ? up3.id : 0, | ||||
|       idUlp: ulp ? ulp.id : 0, | ||||
|       bulan: bulan ? bulan.id : currentMonth.value, | ||||
|       tahun: bulan ? tahun.id : currentYear.value | ||||
|     } | ||||
|   ) | ||||
|  | ||||
|   onResult((queryResult) => { | ||||
|     if (queryResult.data != undefined) { | ||||
|       data.value = queryResult.data.agingComplaintBulanan | ||||
|     } | ||||
|  | ||||
|     console.log(queryResult.data) | ||||
|   }) | ||||
|  | ||||
|   onError((error) => { | ||||
|     console.log(error) | ||||
|   }) | ||||
|  | ||||
|   watch(loading, (value) => { | ||||
|     loadingData.value = value | ||||
|   }) | ||||
| } | ||||
|  | ||||
| onMounted(() => { | ||||
|   | ||||
| @@ -1,87 +1,246 @@ | ||||
| <template> | ||||
|   <Filters :report-button="true" @reset-form="data = []" @run-search="() => filterData(filters)" class="mb-4"> | ||||
|   <Filters | ||||
|     :report-button="true" | ||||
|     @reset-form="data = []" | ||||
|     @run-search="() => filterData(filters)" | ||||
|     class="mb-4" | ||||
|   > | ||||
|     <Type2 @update:filters="(value) => (filters = value)" /> | ||||
|   </Filters> | ||||
|  | ||||
|   <div id="data"> | ||||
|     <DxDataGrid ref="dataGridRef" :allow-column-reordering="true" class="max-h-[calc(100vh-140px)] mb-10" | ||||
|       :data-source="data" :show-column-lines="true" :show-row-lines="false" :show-borders="true" | ||||
|       :row-alternation-enabled="true" :hover-state-enabled="true" @selection-changed="onSelectionChanged" | ||||
|       @exporting="onExporting" :allow-column-resizing="true" column-resizing-mode="widget" :word-wrap-enabled="true"> | ||||
|     <DxDataGrid | ||||
|       ref="dataGridRef" | ||||
|       :allow-column-reordering="true" | ||||
|       class="max-h-[calc(100vh-140px)] mb-10" | ||||
|       :data-source="data" | ||||
|       :show-column-lines="true" | ||||
|       :show-row-lines="false" | ||||
|       :show-borders="true" | ||||
|       :row-alternation-enabled="true" | ||||
|       :hover-state-enabled="true" | ||||
|       @selection-changed="onDataSelectionChanged" | ||||
|       @exporting="onExporting" | ||||
|       :allow-column-resizing="true" | ||||
|       column-resizing-mode="widget" | ||||
|       :word-wrap-enabled="true" | ||||
|     > | ||||
|       <DxGrouping expand-mode="rowClick" /> | ||||
|       <DxSelection mode="single" /> | ||||
|       <DxPaging :enabled="false" /> | ||||
|       <DxScrolling column-rendering-mode="virtual" mode="virtual" /> | ||||
|       <DxLoadPanel shading-color="rgba(0,0,0,0.4)" :position="position" :show-indicator="showIndicator" | ||||
|         :show-pane="showPane" :shading="shading" v-if="loading" v-model:visible="loading" :enabled="true" /> | ||||
|       <DxLoadPanel | ||||
|         shading-color="rgba(0,0,0,0.4)" | ||||
|         :position="position" | ||||
|         :show-indicator="showIndicator" | ||||
|         :show-pane="showPane" | ||||
|         :shading="shading" | ||||
|         v-model:visible="loadingData" | ||||
|         :enabled="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" /> | ||||
|  | ||||
|       <DxColumn alignment="center" :caption="`Periode: ${getMonthName(currentMonth)}, ${currentYear}`" | ||||
|         css-class="custom-table-column"> | ||||
|         <DxColumn alignment="center" :min-width="170" data-type="text" data-field="nama_regional" | ||||
|           caption="Nama Regional" css-class="custom-table-column" :group-index="0" /> | ||||
|         <DxColumn alignment="center" :min-width="170" data-type="text" data-field="nama_uid" caption="Nama UID" | ||||
|           css-class="custom-table-column" :group-index="1" /> | ||||
|         <DxColumn alignment="center" :min-width="170" data-type="text" data-field="nama_up3" caption="Nama UP3" | ||||
|           css-class="custom-table-column" :group-index="2" /> | ||||
|         <DxColumn alignment="center" :min-width="170" data-type="text" data-field="nama_ulp" caption="Nama Unit" | ||||
|           css-class="custom-table-column" name="namaULP" cell-template="formatText" /> | ||||
|       <DxColumn | ||||
|         alignment="center" | ||||
|         :caption="`Periode: ${getMonthName(currentMonth)}, ${currentYear}`" | ||||
|         css-class="custom-table-column" | ||||
|       > | ||||
|         <DxColumn | ||||
|           alignment="center" | ||||
|           :min-width="170" | ||||
|           data-type="text" | ||||
|           data-field="nama_regional" | ||||
|           caption="Nama Regional" | ||||
|           css-class="custom-table-column" | ||||
|           :group-index="0" | ||||
|         /> | ||||
|         <DxColumn | ||||
|           alignment="center" | ||||
|           :min-width="170" | ||||
|           data-type="text" | ||||
|           data-field="nama_uid" | ||||
|           caption="Nama UID" | ||||
|           css-class="custom-table-column" | ||||
|           :group-index="1" | ||||
|         /> | ||||
|         <DxColumn | ||||
|           alignment="center" | ||||
|           :min-width="170" | ||||
|           data-type="text" | ||||
|           data-field="nama_up3" | ||||
|           caption="Nama UP3" | ||||
|           css-class="custom-table-column" | ||||
|           :group-index="2" | ||||
|         /> | ||||
|         <DxColumn | ||||
|           alignment="center" | ||||
|           :min-width="170" | ||||
|           data-type="text" | ||||
|           data-field="nama_ulp" | ||||
|           caption="Nama Unit" | ||||
|           css-class="custom-table-column" | ||||
|           name="namaULP" | ||||
|           cell-template="formatText" | ||||
|         /> | ||||
|       </DxColumn> | ||||
|       <DxColumn alignment="center" caption="ENS (Distribusi)" css-class="custom-table-column"> | ||||
|         <DxColumn :width="150" alignment="center" data-field="terencana" data-type="number" caption="Terencana" | ||||
|           css-class="custom-table-column" cell-template="formatNumber" /> | ||||
|         <DxColumn :width="150" alignment="center" data-field="tidak_terencana" data-type="number" | ||||
|           caption="Tidak Terencana" css-class="custom-table-column" cell-template="formatNumber" /> | ||||
|         <DxColumn :width="150" alignment="center" data-field="bencana_alam" data-type="number" caption="Bencana Alam" | ||||
|           css-class="custom-table-column" cell-template="formatNumber" /> | ||||
|         <DxColumn | ||||
|           :width="150" | ||||
|           alignment="center" | ||||
|           data-field="terencana" | ||||
|           data-type="number" | ||||
|           caption="Terencana" | ||||
|           css-class="custom-table-column" | ||||
|           cell-template="formatNumber" | ||||
|         /> | ||||
|         <DxColumn | ||||
|           :width="150" | ||||
|           alignment="center" | ||||
|           data-field="tidak_terencana" | ||||
|           data-type="number" | ||||
|           caption="Tidak Terencana" | ||||
|           css-class="custom-table-column" | ||||
|           cell-template="formatNumber" | ||||
|         /> | ||||
|         <DxColumn | ||||
|           :width="150" | ||||
|           alignment="center" | ||||
|           data-field="bencana_alam" | ||||
|           data-type="number" | ||||
|           caption="Bencana Alam" | ||||
|           css-class="custom-table-column" | ||||
|           cell-template="formatNumber" | ||||
|         /> | ||||
|       </DxColumn> | ||||
|       <DxColumn :width="170" alignment="center" data-field="total" data-type="number" caption="Total" | ||||
|         css-class="custom-table-column" cell-template="formatNumber" /> | ||||
|       <DxColumn :min-width="170" alignment="center" data-field="kpi_ens" data-type="number" caption="KPI ENS" | ||||
|         css-class="custom-table-column" cell-template="formatNumber" /> | ||||
|       <DxColumn | ||||
|         :width="170" | ||||
|         alignment="center" | ||||
|         data-field="total" | ||||
|         data-type="number" | ||||
|         caption="Total" | ||||
|         css-class="custom-table-column" | ||||
|         cell-template="formatNumber" | ||||
|       /> | ||||
|       <DxColumn | ||||
|         :min-width="170" | ||||
|         alignment="center" | ||||
|         data-field="kpi_ens" | ||||
|         data-type="number" | ||||
|         caption="KPI ENS" | ||||
|         css-class="custom-table-column" | ||||
|         cell-template="formatNumber" | ||||
|       /> | ||||
|  | ||||
|       <DxSummary> | ||||
|         <DxTotalItem summary-type="sum" display-format="Total" show-in-column="nama_ulp" | ||||
|           css-class="text-white !text-left" /> | ||||
|         <DxTotalItem column="terencana" summary-type="sum" display-format="{0}" css-class="text-white !text-right" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxTotalItem column="tidak_terencana" summary-type="sum" display-format="{0}" css-class="text-white !text-right" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxTotalItem column="bencana_alam" summary-type="sum" display-format="{0}" css-class="text-white !text-right" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxTotalItem column="total" summary-type="sum" display-format="{0}" css-class="text-white !text-right" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxTotalItem column="kpi_ens" summary-type="sum" display-format="{0}" css-class="text-white !text-right" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxTotalItem | ||||
|           summary-type="sum" | ||||
|           display-format="Total" | ||||
|           show-in-column="nama_ulp" | ||||
|           css-class="text-white !text-left" | ||||
|         /> | ||||
|         <DxTotalItem | ||||
|           column="terencana" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           css-class="text-white !text-right" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|         <DxTotalItem | ||||
|           column="tidak_terencana" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           css-class="text-white !text-right" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|         <DxTotalItem | ||||
|           column="bencana_alam" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           css-class="text-white !text-right" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|         <DxTotalItem | ||||
|           column="total" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           css-class="text-white !text-right" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|         <DxTotalItem | ||||
|           column="kpi_ens" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           css-class="text-white !text-right" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|  | ||||
|         <DxGroupItem css-class="!text-right" show-in-column="terencana" :show-in-group-footer="false" | ||||
|           :align-by-column="true" column="terencana" summary-type="sum" display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxGroupItem css-class="!text-right" show-in-column="tidak_terencana" :show-in-group-footer="false" | ||||
|           :align-by-column="true" column="tidak_terencana" summary-type="sum" display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxGroupItem css-class="!text-right" show-in-column="bencana_alam" :show-in-group-footer="false" | ||||
|           :align-by-column="true" column="bencana_alam" summary-type="sum" display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxGroupItem css-class="!text-right" show-in-column="total" :show-in-group-footer="false" | ||||
|           :align-by-column="true" column="total" summary-type="sum" display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxGroupItem css-class="!text-right" show-in-column="kpi_ens" :show-in-group-footer="false" | ||||
|           :align-by-column="true" column="kpi_ens" summary-type="sum" display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxGroupItem | ||||
|           css-class="!text-right" | ||||
|           show-in-column="terencana" | ||||
|           :show-in-group-footer="false" | ||||
|           :align-by-column="true" | ||||
|           column="terencana" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|         <DxGroupItem | ||||
|           css-class="!text-right" | ||||
|           show-in-column="tidak_terencana" | ||||
|           :show-in-group-footer="false" | ||||
|           :align-by-column="true" | ||||
|           column="tidak_terencana" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|         <DxGroupItem | ||||
|           css-class="!text-right" | ||||
|           show-in-column="bencana_alam" | ||||
|           :show-in-group-footer="false" | ||||
|           :align-by-column="true" | ||||
|           column="bencana_alam" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|         <DxGroupItem | ||||
|           css-class="!text-right" | ||||
|           show-in-column="total" | ||||
|           :show-in-group-footer="false" | ||||
|           :align-by-column="true" | ||||
|           column="total" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|         <DxGroupItem | ||||
|           css-class="!text-right" | ||||
|           show-in-column="kpi_ens" | ||||
|           :show-in-group-footer="false" | ||||
|           :align-by-column="true" | ||||
|           column="kpi_ens" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|       </DxSummary> | ||||
|  | ||||
|       <template #formatNumber="{ data }"> | ||||
|         <p class="text-right cursor-pointer"> | ||||
|           {{ | ||||
|     isNumber(data.text) | ||||
|       ? data.column.caption == '%' | ||||
|         ? formatPercentage(data.text) | ||||
|         : formatNumber(data.text) | ||||
|       : data.text | ||||
|   }} | ||||
|             isNumber(data.text) | ||||
|               ? data.column.caption == '%' | ||||
|                 ? formatPercentage(data.text) | ||||
|                 : formatNumber(data.text) | ||||
|               : data.text | ||||
|           }} | ||||
|         </p> | ||||
|       </template> | ||||
|  | ||||
| @@ -95,7 +254,7 @@ | ||||
| </template> | ||||
|  | ||||
| <script setup lang="ts"> | ||||
| import { onMounted, ref } from 'vue' | ||||
| import { onMounted, ref, watch } from 'vue' | ||||
| import Filters from '@/components/Form/Filters.vue' | ||||
| import Type2 from '@/components/Form/FiltersType/Type2.vue' | ||||
| import { DxDataGrid } from 'devextreme-vue' | ||||
| @@ -122,12 +281,23 @@ import { useQuery } from '@vue/apollo-composable' | ||||
| import { queries } from '@/utils/api/api.graphql' | ||||
| import { formatNumber, formatPercentage, isNumber } from '@/utils/numbers' | ||||
| import { getMonthName } from '@/utils/texts' | ||||
| import { apolloClient } from '@/utils/api/api.graphql' | ||||
| import { provideApolloClient } from '@vue/apollo-composable' | ||||
|  | ||||
| const client = apolloClient() | ||||
| provideApolloClient(client) | ||||
| const position = { of: '#data' } | ||||
| const showIndicator = ref(true) | ||||
| const shading = ref(true) | ||||
| const showPane = ref(true) | ||||
| const data = ref<any[]>([]) | ||||
| const dataSub = ref<any[]>([]) | ||||
| const dataSelected = ref<any>() | ||||
| const dataSubSelected = ref<any>() | ||||
| const dialogDetail = ref(false) | ||||
| const closedialogDetail = () => (dialogDetail.value = false) | ||||
| const loadingData = ref(false) | ||||
| const loadingSubData = ref(false) | ||||
| const currentYear = ref(new Date().getFullYear()) | ||||
| const currentMonth = ref(new Date().getMonth()) | ||||
| const lastYear = ref(currentYear.value - 1) | ||||
| @@ -161,49 +331,97 @@ const onExporting = (e: any) => { | ||||
|     e.cancel = true | ||||
|   } | ||||
| } | ||||
| const getDetail = () => { | ||||
|   const dateValue = filters.value.periode.split(' s/d ') | ||||
|   const selected = dataSelected.value | ||||
|  | ||||
|   const query = { | ||||
|     dateFrom: dateValue[0] | ||||
|       ? dateValue[0].split('-').reverse().join('-') | ||||
|       : new Date().toISOString().slice(0, 10), | ||||
|     dateTo: dateValue[1] | ||||
|       ? dateValue[1].split('-').reverse().join('-') | ||||
|       : new Date().toISOString().slice(0, 10), | ||||
|     idUlp: selected?.id_ulp ? selected?.id_ulp : 0, | ||||
|     idUid: selected?.id_uid ? selected?.id_uid : 0, | ||||
|     idUp3: selected?.id_up3 ? selected?.id_up3 : 0 | ||||
|   } | ||||
|  | ||||
|   const { onResult, onError, loading } = useQuery( | ||||
|     queries.keluhan.rekap.rekapKeluhanAllDetail, | ||||
|     query | ||||
|   ) | ||||
|  | ||||
|   onResult((queryResult) => { | ||||
|     if (queryResult.data != undefined) { | ||||
|       dataSub.value = queryResult.data.detailKeluhanAll | ||||
|     } | ||||
|   }) | ||||
|  | ||||
|   onError((error) => { | ||||
|     console.log(error) | ||||
|   }) | ||||
|  | ||||
|   watch(loading, (value) => { | ||||
|     loadingSubData.value = value | ||||
|   }) | ||||
| } | ||||
|  | ||||
| const dataGridRef = ref<DxDataGrid | null>(null) | ||||
| const clearSelection = () => { | ||||
|   const dataGrid = dataGridRef.value!.instance! | ||||
|   dataGrid.clearSelection() | ||||
| } | ||||
| const onSelectionChanged = ({ selectedRowsData }: any) => { | ||||
|   const data = selectedRowsData[0] | ||||
| const showDetail = () => { | ||||
|   clearSelection() | ||||
|   dataSubSelected.value = null | ||||
|   dialogDetail.value = true | ||||
|   getDetail() | ||||
| } | ||||
|  | ||||
| const { onResult, onError, loading, refetch } = useQuery( | ||||
|   queries.monalisa.laporan.bulanan.energyNotSalesBulanan, | ||||
|   { | ||||
|     // regional: 0, | ||||
|     idUp3: 0, | ||||
|     idUid: 0, | ||||
|     idUlp: 0, | ||||
|     bulan: currentMonth.value, | ||||
|     tahun: currentYear.value | ||||
| const onDataSelectionChanged = ({ selectedRowsData }: any) => { | ||||
|   if (selectedRowsData[0] != undefined) { | ||||
|     dataSelected.value = selectedRowsData[0] | ||||
|     showDetail() | ||||
|   } | ||||
| ) | ||||
| } | ||||
|  | ||||
| const onDataSubSelectionChanged = ({ selectedRowsData }: any) => { | ||||
|   const data = selectedRowsData[0] | ||||
|   dataSubSelected.value = data | ||||
| } | ||||
|  | ||||
| const filterData = (params: any) => { | ||||
|   const { regional, ulp, uid, up3, bulan, tahun } = params | ||||
|   currentMonth.value = bulan.id | ||||
|   currentYear.value = tahun.id | ||||
|   lastYear.value = tahun.id - 1 | ||||
|   refetch({ | ||||
|     // regional: regional, | ||||
|     idUid: uid ? uid.id : 0, | ||||
|     idUp3: up3 ? up3.id : 0, | ||||
|     idUlp: ulp ? ulp.id : 0, | ||||
|     bulan: bulan ? bulan.id : currentMonth.value, | ||||
|     tahun: bulan ? tahun.id : currentYear.value | ||||
|   }) | ||||
|  | ||||
|   const { onResult, onError, loading, refetch } = useQuery( | ||||
|     queries.monalisa.laporan.bulanan.energyNotSalesBulanan, | ||||
|     { | ||||
|       namaRegional: regional.name == 'Semua Regional' ? '' : regional.name, | ||||
|       idUid: uid ? uid.id : 0, | ||||
|       idUp3: up3 ? up3.id : 0, | ||||
|       idUlp: ulp ? ulp.id : 0, | ||||
|       bulan: bulan ? bulan.id : currentMonth.value, | ||||
|       tahun: bulan ? tahun.id : currentYear.value | ||||
|     } | ||||
|   ) | ||||
|  | ||||
|   onResult((queryResult) => { | ||||
|     if (queryResult.data != undefined) { | ||||
|       data.value = queryResult.data.energyNotSalesBulanan | ||||
|     } | ||||
|     console.log(queryResult.data) | ||||
|   }) | ||||
|  | ||||
|   onError((error) => { | ||||
|     console.log(error) | ||||
|   }) | ||||
|  | ||||
|   watch(loading, (value) => { | ||||
|     loadingData.value = value | ||||
|   }) | ||||
| } | ||||
|  | ||||
| onMounted(() => { | ||||
|   | ||||
| @@ -1,91 +1,252 @@ | ||||
| <template> | ||||
|   <Filters :report-button="true" @reset-form="data = []" @run-search="() => filterData(filters)" class="mb-4"> | ||||
|   <Filters | ||||
|     :report-button="true" | ||||
|     @reset-form="data = []" | ||||
|     @run-search="() => filterData(filters)" | ||||
|     class="mb-4" | ||||
|   > | ||||
|     <Type2 @update:filters="(value) => (filters = value)" /> | ||||
|   </Filters> | ||||
|  | ||||
|   <div id="data"> | ||||
|     <DxDataGrid ref="dataGridRef" :allow-column-reordering="true" class="max-h-[calc(100vh-140px)] mb-10" | ||||
|       :data-source="data" :show-column-lines="true" :show-row-lines="false" :show-borders="true" | ||||
|       :row-alternation-enabled="true" :hover-state-enabled="true" @selection-changed="onSelectionChanged" | ||||
|       @exporting="onExporting" :allow-column-resizing="true" column-resizing-mode="widget" :word-wrap-enabled="true"> | ||||
|     <DxDataGrid | ||||
|       ref="dataGridRef" | ||||
|       :allow-column-reordering="true" | ||||
|       class="max-h-[calc(100vh-140px)] mb-10" | ||||
|       :data-source="data" | ||||
|       :show-column-lines="true" | ||||
|       :show-row-lines="false" | ||||
|       :show-borders="true" | ||||
|       :row-alternation-enabled="true" | ||||
|       :hover-state-enabled="true" | ||||
|       @selection-changed="onSelectionChanged" | ||||
|       @exporting="onExporting" | ||||
|       :allow-column-resizing="true" | ||||
|       column-resizing-mode="widget" | ||||
|       :word-wrap-enabled="true" | ||||
|     > | ||||
|       <DxGrouping expand-mode="rowClick" /> | ||||
|       <DxSelection mode="single" /> | ||||
|       <DxPaging :enabled="false" /> | ||||
|       <DxScrolling column-rendering-mode="virtual" mode="virtual" /> | ||||
|       <DxLoadPanel shading-color="rgba(0,0,0,0.4)" :position="position" :show-indicator="showIndicator" | ||||
|         :show-pane="showPane" :shading="shading" v-if="loading" v-model:visible="loading" :enabled="true" /> | ||||
|       <DxLoadPanel | ||||
|         shading-color="rgba(0,0,0,0.4)" | ||||
|         :position="position" | ||||
|         :show-indicator="showIndicator" | ||||
|         :show-pane="showPane" | ||||
|         :shading="shading" | ||||
|         v-model:visible="loadingData" | ||||
|         :enabled="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" /> | ||||
|  | ||||
|       <DxColumn alignment="center" :min-width="170" data-type="text" data-field="nama_regional" caption="Nama Regional" | ||||
|         css-class="custom-table-column" :group-index="0" /> | ||||
|       <DxColumn alignment="center" :min-width="170" data-type="text" data-field="nama_uid" caption="Nama UID" | ||||
|         css-class="custom-table-column" :group-index="1" /> | ||||
|       <DxColumn alignment="center" :min-width="170" data-type="text" data-field="nama_up3" caption="Nama UP3" | ||||
|         css-class="custom-table-column" :group-index="2" /> | ||||
|       <DxColumn alignment="center" :min-width="170" data-type="text" data-field="nama_ulp" caption="Nama Unit" | ||||
|         css-class="custom-table-column" name="namaULP" cell-template="formatText" /> | ||||
|       <DxColumn alignment="center" caption="Kepatuhan dan Akurasi APKT" css-class="custom-table-column"> | ||||
|       <DxColumn | ||||
|         alignment="center" | ||||
|         :min-width="170" | ||||
|         data-type="text" | ||||
|         data-field="nama_regional" | ||||
|         caption="Nama Regional" | ||||
|         css-class="custom-table-column" | ||||
|         :group-index="0" | ||||
|       /> | ||||
|       <DxColumn | ||||
|         alignment="center" | ||||
|         :min-width="170" | ||||
|         data-type="text" | ||||
|         data-field="nama_uid" | ||||
|         caption="Nama UID" | ||||
|         css-class="custom-table-column" | ||||
|         :group-index="1" | ||||
|       /> | ||||
|       <DxColumn | ||||
|         alignment="center" | ||||
|         :min-width="170" | ||||
|         data-type="text" | ||||
|         data-field="nama_up3" | ||||
|         caption="Nama UP3" | ||||
|         css-class="custom-table-column" | ||||
|         :group-index="2" | ||||
|       /> | ||||
|       <DxColumn | ||||
|         alignment="center" | ||||
|         :min-width="170" | ||||
|         data-type="text" | ||||
|         data-field="nama_ulp" | ||||
|         caption="Nama Unit" | ||||
|         css-class="custom-table-column" | ||||
|         name="namaULP" | ||||
|         cell-template="formatText" | ||||
|       /> | ||||
|       <DxColumn | ||||
|         alignment="center" | ||||
|         caption="Kepatuhan dan Akurasi APKT" | ||||
|         css-class="custom-table-column" | ||||
|       > | ||||
|         <DxColumn alignment="center" caption="Gangguan Berulang" css-class="custom-table-column"> | ||||
|           <DxColumn :width="150" alignment="center" data-field="gangguan_berulang" data-type="number" | ||||
|             :caption="`${getMonthNameShort(currentMonth)}, ${currentYear}`" css-class="custom-table-column" | ||||
|             cell-template="formatNumber" /> | ||||
|           <DxColumn :width="150" alignment="center" data-field="gangguan_total" data-type="number" | ||||
|             caption="Total Gangguan" css-class="custom-table-column" cell-template="formatNumber" /> | ||||
|           <DxColumn | ||||
|             :width="150" | ||||
|             alignment="center" | ||||
|             data-field="gangguan_berulang" | ||||
|             data-type="number" | ||||
|             :caption="`${getMonthNameShort(currentMonth)}, ${currentYear}`" | ||||
|             css-class="custom-table-column" | ||||
|             cell-template="formatNumber" | ||||
|           /> | ||||
|           <DxColumn | ||||
|             :width="150" | ||||
|             alignment="center" | ||||
|             data-field="gangguan_total" | ||||
|             data-type="number" | ||||
|             caption="Total Gangguan" | ||||
|             css-class="custom-table-column" | ||||
|             cell-template="formatNumber" | ||||
|           /> | ||||
|         </DxColumn> | ||||
|         <DxColumn alignment="center" caption="Keluhan Berulang" css-class="custom-table-column"> | ||||
|           <DxColumn :width="150" alignment="center" data-field="keluhan_berulang" data-type="number" | ||||
|             :caption="`${getMonthNameShort(currentMonth)}, ${currentYear}`" css-class="custom-table-column" | ||||
|             cell-template="formatNumber" /> | ||||
|           <DxColumn :width="150" alignment="center" data-field="keluhan_total" data-type="number" | ||||
|             caption="Total Keluhan" css-class="custom-table-column" cell-template="formatNumber" /> | ||||
|           <DxColumn | ||||
|             :width="150" | ||||
|             alignment="center" | ||||
|             data-field="keluhan_berulang" | ||||
|             data-type="number" | ||||
|             :caption="`${getMonthNameShort(currentMonth)}, ${currentYear}`" | ||||
|             css-class="custom-table-column" | ||||
|             cell-template="formatNumber" | ||||
|           /> | ||||
|           <DxColumn | ||||
|             :width="150" | ||||
|             alignment="center" | ||||
|             data-field="keluhan_total" | ||||
|             data-type="number" | ||||
|             caption="Total Keluhan" | ||||
|             css-class="custom-table-column" | ||||
|             cell-template="formatNumber" | ||||
|           /> | ||||
|         </DxColumn> | ||||
|       </DxColumn> | ||||
|       <DxColumn :min-width="150" alignment="center" data-field="komplain_pelanggan" data-type="number" | ||||
|         caption="Komplain Pelanggan %" css-class="custom-table-column" cell-template="formatPercentage" /> | ||||
|       <DxColumn | ||||
|         :min-width="150" | ||||
|         alignment="center" | ||||
|         data-field="komplain_pelanggan" | ||||
|         data-type="number" | ||||
|         caption="Komplain Pelanggan %" | ||||
|         css-class="custom-table-column" | ||||
|         cell-template="formatPercentage" | ||||
|       /> | ||||
|  | ||||
|       <DxSummary> | ||||
|         <DxTotalItem summary-type="sum" display-format="Total" show-in-column="nama_ulp" | ||||
|           css-class="text-white !text-left" /> | ||||
|         <DxTotalItem column="gangguan_berulang" summary-type="sum" display-format="{0}" | ||||
|           css-class="text-white !text-right" :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxTotalItem column="gangguan_total" summary-type="sum" display-format="{0}" css-class="text-white !text-right" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxTotalItem column="keluhan_berulang" summary-type="sum" display-format="{0}" | ||||
|           css-class="text-white !text-right" :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxTotalItem column="keluhan_total" summary-type="sum" display-format="{0}" css-class="text-white !text-right" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxTotalItem column="komplain_pelanggan" summary-type="sum" display-format="{0}" | ||||
|           css-class="text-white !text-right" :customize-text="(e: any) => (parseFloat(e.value.toString()) ? formatPercentage(e.value) : '0%') | ||||
|     " /> | ||||
|         <DxTotalItem | ||||
|           summary-type="sum" | ||||
|           display-format="Total" | ||||
|           show-in-column="nama_ulp" | ||||
|           css-class="text-white !text-left" | ||||
|         /> | ||||
|         <DxTotalItem | ||||
|           column="gangguan_berulang" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           css-class="text-white !text-right" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|         <DxTotalItem | ||||
|           column="gangguan_total" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           css-class="text-white !text-right" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|         <DxTotalItem | ||||
|           column="keluhan_berulang" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           css-class="text-white !text-right" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|         <DxTotalItem | ||||
|           column="keluhan_total" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           css-class="text-white !text-right" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|         <DxTotalItem | ||||
|           column="komplain_pelanggan" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           css-class="text-white !text-right" | ||||
|           :customize-text=" | ||||
|             (e: any) => (parseFloat(e.value.toString()) ? formatPercentage(e.value) : '0%') | ||||
|           " | ||||
|         /> | ||||
|  | ||||
|         <DxGroupItem css-class="!text-right" show-in-column="gangguan_berulang" :show-in-group-footer="false" | ||||
|           :align-by-column="true" column="gangguan_berulang" summary-type="sum" display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxGroupItem css-class="!text-right" show-in-column="gangguan_total" :show-in-group-footer="false" | ||||
|           :align-by-column="true" column="gangguan_total" summary-type="sum" display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxGroupItem css-class="!text-right" show-in-column="keluhan_berulang" :show-in-group-footer="false" | ||||
|           :align-by-column="true" column="keluhan_berulang" summary-type="sum" display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxGroupItem css-class="!text-right" show-in-column="keluhan_total" :show-in-group-footer="false" | ||||
|           :align-by-column="true" column="keluhan_total" summary-type="sum" display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxGroupItem css-class="!text-right" show-in-column="komplain_pelanggan" :show-in-group-footer="false" | ||||
|           :align-by-column="true" column="komplain_pelanggan" summary-type="sum" display-format="{0}" :customize-text="(e: any) => (parseFloat(e.value.toString()) ? formatPercentage(e.value) : '0%') | ||||
|     " /> | ||||
|         <DxGroupItem | ||||
|           css-class="!text-right" | ||||
|           show-in-column="gangguan_berulang" | ||||
|           :show-in-group-footer="false" | ||||
|           :align-by-column="true" | ||||
|           column="gangguan_berulang" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|         <DxGroupItem | ||||
|           css-class="!text-right" | ||||
|           show-in-column="gangguan_total" | ||||
|           :show-in-group-footer="false" | ||||
|           :align-by-column="true" | ||||
|           column="gangguan_total" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|         <DxGroupItem | ||||
|           css-class="!text-right" | ||||
|           show-in-column="keluhan_berulang" | ||||
|           :show-in-group-footer="false" | ||||
|           :align-by-column="true" | ||||
|           column="keluhan_berulang" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|         <DxGroupItem | ||||
|           css-class="!text-right" | ||||
|           show-in-column="keluhan_total" | ||||
|           :show-in-group-footer="false" | ||||
|           :align-by-column="true" | ||||
|           column="keluhan_total" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|         <DxGroupItem | ||||
|           css-class="!text-right" | ||||
|           show-in-column="komplain_pelanggan" | ||||
|           :show-in-group-footer="false" | ||||
|           :align-by-column="true" | ||||
|           column="komplain_pelanggan" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           :customize-text=" | ||||
|             (e: any) => (parseFloat(e.value.toString()) ? formatPercentage(e.value) : '0%') | ||||
|           " | ||||
|         /> | ||||
|       </DxSummary> | ||||
|  | ||||
|       <template #formatNumber="{ data }"> | ||||
|         <p class="text-right cursor-pointer"> | ||||
|           {{ | ||||
|     isNumber(data.text) | ||||
|       ? data.column.caption == '%' | ||||
|         ? formatPercentage(data.text) | ||||
|         : formatNumber(data.text) | ||||
|       : data.text | ||||
|   }} | ||||
|             isNumber(data.text) | ||||
|               ? data.column.caption == '%' | ||||
|                 ? formatPercentage(data.text) | ||||
|                 : formatNumber(data.text) | ||||
|               : data.text | ||||
|           }} | ||||
|         </p> | ||||
|       </template> | ||||
|  | ||||
| @@ -105,7 +266,7 @@ | ||||
| </template> | ||||
|  | ||||
| <script setup lang="ts"> | ||||
| import { onMounted, ref } from 'vue' | ||||
| import { onMounted, ref, watch } from 'vue' | ||||
| import Filters from '@/components/Form/Filters.vue' | ||||
| import Type2 from '@/components/Form/FiltersType/Type2.vue' | ||||
| import { DxDataGrid } from 'devextreme-vue' | ||||
| @@ -132,12 +293,23 @@ import { useQuery } from '@vue/apollo-composable' | ||||
| import { queries } from '@/utils/api/api.graphql' | ||||
| import { getMonthNameShort } from '@/utils/texts' | ||||
| import { formatNumber, formatPercentage, isNumber } from '@/utils/numbers' | ||||
| import { apolloClient } from '@/utils/api/api.graphql' | ||||
| import { provideApolloClient } from '@vue/apollo-composable' | ||||
|  | ||||
| const client = apolloClient() | ||||
| provideApolloClient(client) | ||||
| const position = { of: '#data' } | ||||
| const showIndicator = ref(true) | ||||
| const shading = ref(true) | ||||
| const showPane = ref(true) | ||||
| const data = ref<any[]>([]) | ||||
| const dataSub = ref<any[]>([]) | ||||
| const dataSelected = ref<any>() | ||||
| const dataSubSelected = ref<any>() | ||||
| const dialogDetail = ref(false) | ||||
| const closedialogDetail = () => (dialogDetail.value = false) | ||||
| const loadingData = ref(false) | ||||
| const loadingSubData = ref(false) | ||||
| const currentYear = ref(new Date().getFullYear()) | ||||
| const currentMonth = ref(new Date().getMonth()) | ||||
| const lastYear = ref(currentYear.value - 1) | ||||
| @@ -181,47 +353,37 @@ const onSelectionChanged = ({ selectedRowsData }: any) => { | ||||
|   clearSelection() | ||||
| } | ||||
|  | ||||
| const { onResult, onError, loading, refetch } = useQuery( | ||||
|   queries.monalisa.laporan.bulanan.kepatuhandanAkurasiDalamPelaporanBulanan, | ||||
|   { | ||||
|     // regional: 0, | ||||
|     idUp3: 0, | ||||
|     idUid: 0, | ||||
|     idUlp: 0, | ||||
|     bulan: currentMonth.value, | ||||
|     tahun: currentYear.value | ||||
|   } | ||||
| ) | ||||
|  | ||||
| const filterData = (params: any) => { | ||||
|   const { regional, ulp, uid, up3, bulan, tahun } = params | ||||
|   currentMonth.value = bulan.id | ||||
|   currentYear.value = tahun.id | ||||
|   lastYear.value = tahun.id - 1 | ||||
|   refetch({ | ||||
|     // regional: regional, | ||||
|     idUid: uid ? uid.id : 0, | ||||
|     idUp3: up3 ? up3.id : 0, | ||||
|     idUlp: ulp ? ulp.id : 0, | ||||
|     bulan: bulan ? bulan.id : currentMonth.value, | ||||
|     tahun: bulan ? tahun.id : currentYear.value | ||||
|   }) | ||||
|  | ||||
|   const { onResult, onError, loading, refetch } = useQuery( | ||||
|     queries.monalisa.laporan.bulanan.kepatuhandanAkurasiDalamPelaporanBulanan, | ||||
|     { | ||||
|       namaRegional: regional.name == 'Semua Regional' ? '' : regional.name, | ||||
|       idUid: uid ? uid.id : 0, | ||||
|       idUp3: up3 ? up3.id : 0, | ||||
|       idUlp: ulp ? ulp.id : 0, | ||||
|       bulan: bulan ? bulan.id : currentMonth.value, | ||||
|       tahun: bulan ? tahun.id : currentYear.value | ||||
|     } | ||||
|   ) | ||||
|  | ||||
|   onResult((queryResult) => { | ||||
|     if (queryResult.data != undefined) { | ||||
|       queryResult.data.kepatuhandanAkurasiDalamPelaporanBulanan.forEach((item: any) => { | ||||
|         data.value = [ | ||||
|           ...data.value, | ||||
|           { | ||||
|             ...item | ||||
|           } | ||||
|         ] | ||||
|       }) | ||||
|       data.value = queryResult.data.kepatuhandanAkurasiDalamPelaporanBulanan | ||||
|     } | ||||
|     console.log(queryResult.data) | ||||
|   }) | ||||
|  | ||||
|   onError((error) => { | ||||
|     console.log(error) | ||||
|   }) | ||||
|  | ||||
|   watch(loading, (value) => { | ||||
|     loadingData.value = value | ||||
|   }) | ||||
| } | ||||
|  | ||||
| onMounted(() => { | ||||
|   | ||||
| @@ -1,114 +1,324 @@ | ||||
| <template> | ||||
|   <Filters @reset-form="data = []" @run-search="() => filterData(filters)" :report-button="true" class="mb-4"> | ||||
|   <Filters | ||||
|     @reset-form="data = []" | ||||
|     @run-search="() => filterData(filters)" | ||||
|     :report-button="true" | ||||
|     class="mb-4" | ||||
|   > | ||||
|     <Type2 @update:filters="(value) => (filters = value)" /> | ||||
|   </Filters> | ||||
|  | ||||
|   <div id="data"> | ||||
|     <DxDataGrid ref="dataGridRef" :allow-column-reordering="true" class="max-h-[calc(100vh-140px)] mb-10" | ||||
|       :data-source="data" :show-column-lines="true" :show-row-lines="false" :show-borders="true" | ||||
|       :row-alternation-enabled="true" :hover-state-enabled="true" @selection-changed="onSelectionChanged" | ||||
|       @exporting="onExporting" :allow-column-resizing="true" column-resizing-mode="widget" :word-wrap-enabled="true"> | ||||
|     <DxDataGrid | ||||
|       ref="dataGridRef" | ||||
|       :allow-column-reordering="true" | ||||
|       class="max-h-[calc(100vh-140px)] mb-10" | ||||
|       :data-source="data" | ||||
|       :show-column-lines="true" | ||||
|       :show-row-lines="false" | ||||
|       :show-borders="true" | ||||
|       :row-alternation-enabled="true" | ||||
|       :hover-state-enabled="true" | ||||
|       @selection-changed="onDataSelectionChanged" | ||||
|       @exporting="onExporting" | ||||
|       :allow-column-resizing="true" | ||||
|       column-resizing-mode="widget" | ||||
|       :word-wrap-enabled="true" | ||||
|     > | ||||
|       <DxGrouping expand-mode="rowClick" /> | ||||
|       <DxSelection mode="single" /> | ||||
|       <DxPaging :enabled="false" /> | ||||
|       <DxScrolling column-rendering-mode="virtual" mode="virtual" /> | ||||
|       <DxLoadPanel shading-color="rgba(0,0,0,0.4)" :position="position" :show-indicator="showIndicator" | ||||
|         :show-pane="showPane" :shading="shading" v-if="loading" v-model:visible="loading" :enabled="true" /> | ||||
|       <DxLoadPanel | ||||
|         shading-color="rgba(0,0,0,0.4)" | ||||
|         :position="position" | ||||
|         :show-indicator="showIndicator" | ||||
|         :show-pane="showPane" | ||||
|         :shading="shading" | ||||
|         v-model:visible="loadingData" | ||||
|         :enabled="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" /> | ||||
|  | ||||
|       <DxColumn alignment="center" :caption="`Periode: ${getMonthName(currentMonth)}, ${currentYear}`" | ||||
|         css-class="custom-table-column"> | ||||
|         <DxColumn alignment="center" :min-width="170" data-type="text" data-field="nama_regional" | ||||
|           caption="Nama Regional" css-class="custom-table-column" :group-index="0" /> | ||||
|         <DxColumn alignment="center" :min-width="170" data-type="text" data-field="nama_uid" caption="Nama UID" | ||||
|           css-class="custom-table-column" :group-index="1" /> | ||||
|         <DxColumn alignment="center" :min-width="170" data-type="text" data-field="nama_up3" caption="Nama UP3" | ||||
|           css-class="custom-table-column" :group-index="2" /> | ||||
|         <DxColumn alignment="center" :min-width="170" data-type="text" data-field="nama_ulp" caption="Nama Unit" | ||||
|           css-class="custom-table-column" name="namaULP" cell-template="formatText" /> | ||||
|       <DxColumn | ||||
|         alignment="center" | ||||
|         :caption="`Periode: ${getMonthName(currentMonth)}, ${currentYear}`" | ||||
|         css-class="custom-table-column" | ||||
|       > | ||||
|         <DxColumn | ||||
|           alignment="center" | ||||
|           :min-width="170" | ||||
|           data-type="text" | ||||
|           data-field="nama_regional" | ||||
|           caption="Nama Regional" | ||||
|           css-class="custom-table-column" | ||||
|           :group-index="0" | ||||
|         /> | ||||
|         <DxColumn | ||||
|           alignment="center" | ||||
|           :min-width="170" | ||||
|           data-type="text" | ||||
|           data-field="nama_uid" | ||||
|           caption="Nama UID" | ||||
|           css-class="custom-table-column" | ||||
|           :group-index="1" | ||||
|         /> | ||||
|         <DxColumn | ||||
|           alignment="center" | ||||
|           :min-width="170" | ||||
|           data-type="text" | ||||
|           data-field="nama_up3" | ||||
|           caption="Nama UP3" | ||||
|           css-class="custom-table-column" | ||||
|           :group-index="2" | ||||
|         /> | ||||
|         <DxColumn | ||||
|           alignment="center" | ||||
|           :min-width="170" | ||||
|           data-type="text" | ||||
|           data-field="nama_ulp" | ||||
|           caption="Nama Unit" | ||||
|           css-class="custom-table-column" | ||||
|           name="namaULP" | ||||
|           cell-template="formatText" | ||||
|         /> | ||||
|       </DxColumn> | ||||
|       <DxColumn alignment="center" caption="Aging Complains" css-class="custom-table-column"> | ||||
|         <DxColumn alignment="center" caption="Rata-Rata RCT Gangguan" css-class="custom-table-column"> | ||||
|           <DxColumn :width="150" alignment="center" data-field="avg_durasi_recovery_gangguan" data-type="number" | ||||
|             :caption="`Periode: ${getMonthNameShort(currentMonth)}, ${currentYear}`" css-class="custom-table-column" | ||||
|             cell-template="formatNumber" /> | ||||
|           <DxColumn :width="150" alignment="center" data-field="sla_gangguan" data-type="number" caption="SLA (Menit)" | ||||
|             css-class="custom-table-column" cell-template="formatNumber" /> | ||||
|         <DxColumn | ||||
|           alignment="center" | ||||
|           caption="Rata-Rata RCT Gangguan" | ||||
|           css-class="custom-table-column" | ||||
|         > | ||||
|           <DxColumn | ||||
|             :width="150" | ||||
|             alignment="center" | ||||
|             data-field="avg_durasi_recovery_gangguan" | ||||
|             data-type="number" | ||||
|             :caption="`Periode: ${getMonthNameShort(currentMonth)}, ${currentYear}`" | ||||
|             css-class="custom-table-column" | ||||
|             cell-template="formatNumber" | ||||
|           /> | ||||
|           <DxColumn | ||||
|             :width="150" | ||||
|             alignment="center" | ||||
|             data-field="sla_gangguan" | ||||
|             data-type="number" | ||||
|             caption="SLA (Menit)" | ||||
|             css-class="custom-table-column" | ||||
|             cell-template="formatNumber" | ||||
|           /> | ||||
|         </DxColumn> | ||||
|         <DxColumn alignment="center" caption="Rata-Rata RCT Keluhan" css-class="custom-table-column"> | ||||
|           <DxColumn :width="150" alignment="center" data-field="avg_durasi_recovery_keluhan" data-type="number" | ||||
|             :caption="`Periode: ${getMonthNameShort(currentMonth)}, ${currentYear}`" css-class="custom-table-column" | ||||
|             cell-template="formatNumber" /> | ||||
|           <DxColumn :width="150" alignment="center" data-field="sla_keluhan" data-type="number" caption="SLA (Jam)" | ||||
|             css-class="custom-table-column" cell-template="formatNumber" /> | ||||
|         <DxColumn | ||||
|           alignment="center" | ||||
|           caption="Rata-Rata RCT Keluhan" | ||||
|           css-class="custom-table-column" | ||||
|         > | ||||
|           <DxColumn | ||||
|             :width="150" | ||||
|             alignment="center" | ||||
|             data-field="avg_durasi_recovery_keluhan" | ||||
|             data-type="number" | ||||
|             :caption="`Periode: ${getMonthNameShort(currentMonth)}, ${currentYear}`" | ||||
|             css-class="custom-table-column" | ||||
|             cell-template="formatNumber" | ||||
|           /> | ||||
|           <DxColumn | ||||
|             :width="150" | ||||
|             alignment="center" | ||||
|             data-field="sla_keluhan" | ||||
|             data-type="number" | ||||
|             caption="SLA (Jam)" | ||||
|             css-class="custom-table-column" | ||||
|             cell-template="formatNumber" | ||||
|           /> | ||||
|         </DxColumn> | ||||
|       </DxColumn> | ||||
|       <DxColumn alignment="center" caption="% Aging Complains" css-class="custom-table-column"> | ||||
|         <DxColumn :width="150" alignment="center" data-field="aging_complaint_gangguan" data-type="number" caption="G" | ||||
|           css-class="custom-table-column" cell-template="formatPercentage" /> | ||||
|         <DxColumn :width="150" alignment="center" data-field="aging_complaint_keluhan" data-type="number" caption="K" | ||||
|           css-class="custom-table-column" cell-template="formatPercentage" /> | ||||
|         <DxColumn | ||||
|           :width="150" | ||||
|           alignment="center" | ||||
|           data-field="aging_complaint_gangguan" | ||||
|           data-type="number" | ||||
|           caption="G" | ||||
|           css-class="custom-table-column" | ||||
|           cell-template="formatPercentage" | ||||
|         /> | ||||
|         <DxColumn | ||||
|           :width="150" | ||||
|           alignment="center" | ||||
|           data-field="aging_complaint_keluhan" | ||||
|           data-type="number" | ||||
|           caption="K" | ||||
|           css-class="custom-table-column" | ||||
|           cell-template="formatPercentage" | ||||
|         /> | ||||
|       </DxColumn> | ||||
|       <DxColumn :min-width="170" alignment="center" data-field="avg_aging_complaint" data-type="number" | ||||
|         caption="% Rata-Rata Aging Complains" css-class="custom-table-column" cell-template="formatPercentage" /> | ||||
|       <DxColumn | ||||
|         :min-width="170" | ||||
|         alignment="center" | ||||
|         data-field="avg_aging_complaint" | ||||
|         data-type="number" | ||||
|         caption="% Rata-Rata Aging Complains" | ||||
|         css-class="custom-table-column" | ||||
|         cell-template="formatPercentage" | ||||
|       /> | ||||
|  | ||||
|       <DxSummary> | ||||
|         <DxTotalItem summary-type="sum" display-format="RATA-RATA NASIONAL" show-in-column="nama_ulp" | ||||
|           css-class="text-white !text-left" /> | ||||
|         <DxTotalItem column="avg_durasi_recovery_gangguan" summary-type="sum" display-format="{0}" | ||||
|           css-class="text-white !text-right" :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxTotalItem column="sla_gangguan" summary-type="sum" display-format="{0}" css-class="text-white !text-right" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxTotalItem column="avg_durasi_recovery_keluhan" summary-type="sum" display-format="{0}" | ||||
|           css-class="text-white !text-right" :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxTotalItem column="sla_keluhan" summary-type="sum" display-format="{0}" css-class="text-white !text-right" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxTotalItem column="aging_complaint_gangguan" summary-type="avg" display-format="{0}" | ||||
|           css-class="text-white !text-right" :customize-text="(e: any) => (parseFloat(e.value.toString()) ? formatPercentage(e.value) : '0%') | ||||
|     " /> | ||||
|         <DxTotalItem column="aging_complaint_keluhan" summary-type="avg" display-format="{0}" | ||||
|           css-class="text-white !text-right" :customize-text="(e: any) => (parseFloat(e.value.toString()) ? formatPercentage(e.value) : '0%') | ||||
|     " /> | ||||
|         <DxTotalItem column="avg_aging_complaint" summary-type="avg" display-format="{0}" | ||||
|           css-class="text-white !text-right" :customize-text="(e: any) => (parseFloat(e.value.toString()) ? formatPercentage(e.value) : '0%') | ||||
|     " /> | ||||
|         <DxTotalItem | ||||
|           summary-type="sum" | ||||
|           display-format="RATA-RATA NASIONAL" | ||||
|           show-in-column="nama_ulp" | ||||
|           css-class="text-white !text-left" | ||||
|         /> | ||||
|         <DxTotalItem | ||||
|           column="avg_durasi_recovery_gangguan" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           css-class="text-white !text-right" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|         <DxTotalItem | ||||
|           column="sla_gangguan" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           css-class="text-white !text-right" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|         <DxTotalItem | ||||
|           column="avg_durasi_recovery_keluhan" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           css-class="text-white !text-right" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|         <DxTotalItem | ||||
|           column="sla_keluhan" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           css-class="text-white !text-right" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|         <DxTotalItem | ||||
|           column="aging_complaint_gangguan" | ||||
|           summary-type="avg" | ||||
|           display-format="{0}" | ||||
|           css-class="text-white !text-right" | ||||
|           :customize-text=" | ||||
|             (e: any) => (parseFloat(e.value.toString()) ? formatPercentage(e.value) : '0%') | ||||
|           " | ||||
|         /> | ||||
|         <DxTotalItem | ||||
|           column="aging_complaint_keluhan" | ||||
|           summary-type="avg" | ||||
|           display-format="{0}" | ||||
|           css-class="text-white !text-right" | ||||
|           :customize-text=" | ||||
|             (e: any) => (parseFloat(e.value.toString()) ? formatPercentage(e.value) : '0%') | ||||
|           " | ||||
|         /> | ||||
|         <DxTotalItem | ||||
|           column="avg_aging_complaint" | ||||
|           summary-type="avg" | ||||
|           display-format="{0}" | ||||
|           css-class="text-white !text-right" | ||||
|           :customize-text=" | ||||
|             (e: any) => (parseFloat(e.value.toString()) ? formatPercentage(e.value) : '0%') | ||||
|           " | ||||
|         /> | ||||
|  | ||||
|         <DxGroupItem css-class="!text-right" show-in-column="avg_durasi_recovery_gangguan" :show-in-group-footer="false" | ||||
|           :align-by-column="true" column="avg_durasi_recovery_gangguan" summary-type="sum" display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxGroupItem css-class="!text-right" show-in-column="sla_gangguan" :show-in-group-footer="false" | ||||
|           :align-by-column="true" column="sla_gangguan" summary-type="sum" display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxGroupItem css-class="!text-right" show-in-column="avg_durasi_recovery_keluhan" :show-in-group-footer="false" | ||||
|           :align-by-column="true" column="avg_durasi_recovery_keluhan" summary-type="sum" display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxGroupItem css-class="!text-right" show-in-column="sla_keluhan" :show-in-group-footer="false" | ||||
|           :align-by-column="true" column="sla_keluhan" summary-type="sum" display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxGroupItem css-class="!text-right" show-in-column="aging_complaint_gangguan" :show-in-group-footer="false" | ||||
|           :align-by-column="true" column="aging_complaint_gangguan" summary-type="avg" display-format="{0}" | ||||
|           :customize-text="(e: any) => (parseFloat(e.value.toString()) ? formatPercentage(e.value) : '0%') | ||||
|     " /> | ||||
|         <DxGroupItem css-class="!text-right" show-in-column="aging_complaint_keluhan" :show-in-group-footer="false" | ||||
|           :align-by-column="true" column="aging_complaint_keluhan" summary-type="avg" display-format="{0}" | ||||
|           :customize-text="(e: any) => (parseFloat(e.value.toString()) ? formatPercentage(e.value) : '0%') | ||||
|     " /> | ||||
|         <DxGroupItem css-class="!text-right" show-in-column="avg_aging_complaint" :show-in-group-footer="false" | ||||
|           :align-by-column="true" column="avg_aging_complaint" summary-type="avg" display-format="{0}" :customize-text="(e: any) => (parseFloat(e.value.toString()) ? formatPercentage(e.value) : '0%') | ||||
|     " /> | ||||
|         <DxGroupItem | ||||
|           css-class="!text-right" | ||||
|           show-in-column="avg_durasi_recovery_gangguan" | ||||
|           :show-in-group-footer="false" | ||||
|           :align-by-column="true" | ||||
|           column="avg_durasi_recovery_gangguan" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|         <DxGroupItem | ||||
|           css-class="!text-right" | ||||
|           show-in-column="sla_gangguan" | ||||
|           :show-in-group-footer="false" | ||||
|           :align-by-column="true" | ||||
|           column="sla_gangguan" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|         <DxGroupItem | ||||
|           css-class="!text-right" | ||||
|           show-in-column="avg_durasi_recovery_keluhan" | ||||
|           :show-in-group-footer="false" | ||||
|           :align-by-column="true" | ||||
|           column="avg_durasi_recovery_keluhan" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|         <DxGroupItem | ||||
|           css-class="!text-right" | ||||
|           show-in-column="sla_keluhan" | ||||
|           :show-in-group-footer="false" | ||||
|           :align-by-column="true" | ||||
|           column="sla_keluhan" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|         <DxGroupItem | ||||
|           css-class="!text-right" | ||||
|           show-in-column="aging_complaint_gangguan" | ||||
|           :show-in-group-footer="false" | ||||
|           :align-by-column="true" | ||||
|           column="aging_complaint_gangguan" | ||||
|           summary-type="avg" | ||||
|           display-format="{0}" | ||||
|           :customize-text=" | ||||
|             (e: any) => (parseFloat(e.value.toString()) ? formatPercentage(e.value) : '0%') | ||||
|           " | ||||
|         /> | ||||
|         <DxGroupItem | ||||
|           css-class="!text-right" | ||||
|           show-in-column="aging_complaint_keluhan" | ||||
|           :show-in-group-footer="false" | ||||
|           :align-by-column="true" | ||||
|           column="aging_complaint_keluhan" | ||||
|           summary-type="avg" | ||||
|           display-format="{0}" | ||||
|           :customize-text=" | ||||
|             (e: any) => (parseFloat(e.value.toString()) ? formatPercentage(e.value) : '0%') | ||||
|           " | ||||
|         /> | ||||
|         <DxGroupItem | ||||
|           css-class="!text-right" | ||||
|           show-in-column="avg_aging_complaint" | ||||
|           :show-in-group-footer="false" | ||||
|           :align-by-column="true" | ||||
|           column="avg_aging_complaint" | ||||
|           summary-type="avg" | ||||
|           display-format="{0}" | ||||
|           :customize-text=" | ||||
|             (e: any) => (parseFloat(e.value.toString()) ? formatPercentage(e.value) : '0%') | ||||
|           " | ||||
|         /> | ||||
|       </DxSummary> | ||||
|  | ||||
|       <template #formatNumber="{ data }"> | ||||
|         <p class="text-right cursor-pointer"> | ||||
|           {{ | ||||
|     isNumber(data.text) | ||||
|       ? data.column.caption == '%' | ||||
|         ? formatPercentage(data.text) | ||||
|         : formatNumber(data.text) | ||||
|       : data.text | ||||
|   }} | ||||
|             isNumber(data.text) | ||||
|               ? data.column.caption == '%' | ||||
|                 ? formatPercentage(data.text) | ||||
|                 : formatNumber(data.text) | ||||
|               : data.text | ||||
|           }} | ||||
|         </p> | ||||
|       </template> | ||||
|  | ||||
| @@ -128,7 +338,7 @@ | ||||
| </template> | ||||
|  | ||||
| <script setup lang="ts"> | ||||
| import { onMounted, ref } from 'vue' | ||||
| import { onMounted, ref, watch } from 'vue' | ||||
| import Filters from '@/components/Form/Filters.vue' | ||||
| import Type2 from '@/components/Form/FiltersType/Type2.vue' | ||||
| import { DxDataGrid } from 'devextreme-vue' | ||||
| @@ -161,6 +371,13 @@ const showIndicator = ref(true) | ||||
| const shading = ref(true) | ||||
| const showPane = ref(true) | ||||
| const data = ref<any[]>([]) | ||||
| const dataSub = ref<any[]>([]) | ||||
| const dataSelected = ref<any>() | ||||
| const dataSubSelected = ref<any>() | ||||
| const dialogDetail = ref(false) | ||||
| const closedialogDetail = () => (dialogDetail.value = false) | ||||
| const loadingData = ref(false) | ||||
| const loadingSubData = ref(false) | ||||
| const currentYear = ref(new Date().getFullYear()) | ||||
| const currentMonth = ref(new Date().getMonth() + 1) | ||||
|  | ||||
| @@ -192,48 +409,95 @@ const onExporting = (e: any) => { | ||||
|     e.cancel = true | ||||
|   } | ||||
| } | ||||
| const getDetail = () => { | ||||
|   const dateValue = filters.value.periode.split(' s/d ') | ||||
|   const selected = dataSelected.value | ||||
|  | ||||
|   const query = { | ||||
|     dateFrom: dateValue[0] | ||||
|       ? dateValue[0].split('-').reverse().join('-') | ||||
|       : new Date().toISOString().slice(0, 10), | ||||
|     dateTo: dateValue[1] | ||||
|       ? dateValue[1].split('-').reverse().join('-') | ||||
|       : new Date().toISOString().slice(0, 10), | ||||
|     idUlp: selected?.id_ulp ? selected?.id_ulp : 0, | ||||
|     idUid: selected?.id_uid ? selected?.id_uid : 0, | ||||
|     idUp3: selected?.id_up3 ? selected?.id_up3 : 0 | ||||
|   } | ||||
|  | ||||
|   const { onResult, onError, loading } = useQuery( | ||||
|     queries.keluhan.rekap.rekapKeluhanAllDetail, | ||||
|     query | ||||
|   ) | ||||
|  | ||||
|   onResult((queryResult) => { | ||||
|     if (queryResult.data != undefined) { | ||||
|       dataSub.value = queryResult.data.detailKeluhanAll | ||||
|     } | ||||
|   }) | ||||
|  | ||||
|   onError((error) => { | ||||
|     console.log(error) | ||||
|   }) | ||||
|  | ||||
|   watch(loading, (value) => { | ||||
|     loadingSubData.value = value | ||||
|   }) | ||||
| } | ||||
|  | ||||
| const dataGridRef = ref<DxDataGrid | null>(null) | ||||
| const clearSelection = () => { | ||||
|   const dataGrid = dataGridRef.value!.instance! | ||||
|   dataGrid.clearSelection() | ||||
| } | ||||
| const onSelectionChanged = ({ selectedRowsData }: any) => { | ||||
|   const data = selectedRowsData[0] | ||||
| const showDetail = () => { | ||||
|   clearSelection() | ||||
|   dataSubSelected.value = null | ||||
|   dialogDetail.value = true | ||||
|   getDetail() | ||||
| } | ||||
|  | ||||
| const { onResult, onError, loading, refetch } = useQuery( | ||||
|   queries.monalisa.laporan.kumulatif.agingComplaintKumulatif, | ||||
|   { | ||||
|     regional: '', | ||||
|     idUlp: 0, | ||||
|     idUid: 0, | ||||
|     idUp3: 0, | ||||
|     bulan: 10, | ||||
|     tahun: 2023 | ||||
| const onDataSelectionChanged = ({ selectedRowsData }: any) => { | ||||
|   if (selectedRowsData[0] != undefined) { | ||||
|     dataSelected.value = selectedRowsData[0] | ||||
|     showDetail() | ||||
|   } | ||||
| ) | ||||
| } | ||||
|  | ||||
| const onDataSubSelectionChanged = ({ selectedRowsData }: any) => { | ||||
|   const data = selectedRowsData[0] | ||||
|   dataSubSelected.value = data | ||||
| } | ||||
| const filterData = (params: any) => { | ||||
|   const { regional, ulp, uid, up3, bulan, tahun } = params | ||||
|   currentYear.value = tahun.id | ||||
|   currentMonth.value = bulan.id | ||||
|   refetch({ | ||||
|     regional: regional, | ||||
|     idUlp: ulp ? ulp.id : 0, | ||||
|     idUid: uid ? uid.id : 0, | ||||
|     idUp3: up3 ? up3.id : 0, | ||||
|     bulan: bulan ? bulan.id : 10, | ||||
|     tahun: bulan ? tahun.id : 2023 | ||||
|   }) | ||||
|  | ||||
|   const { onResult, onError, loading, refetch } = useQuery( | ||||
|     queries.monalisa.laporan.kumulatif.agingComplaintKumulatif, | ||||
|     { | ||||
|       namaRegional: regional.name == 'Semua Regional' ? '' : regional.name, | ||||
|       idUlp: ulp ? ulp.id : 0, | ||||
|       idUid: uid ? uid.id : 0, | ||||
|       idUp3: up3 ? up3.id : 0, | ||||
|       bulan: bulan ? bulan.id : 10, | ||||
|       tahun: bulan ? tahun.id : 2023 | ||||
|     } | ||||
|   ) | ||||
|  | ||||
|   onResult((queryResult) => { | ||||
|     if (queryResult.data != undefined) { | ||||
|       data.value = queryResult.data.agingComplaintKumulatif | ||||
|     } | ||||
|     console.log(queryResult.data) | ||||
|   }) | ||||
|  | ||||
|   onError((error) => { | ||||
|     console.log(error) | ||||
|   }) | ||||
|  | ||||
|   watch(loading, (value) => { | ||||
|     loadingData.value = value | ||||
|   }) | ||||
| } | ||||
| const filters = ref() | ||||
|  | ||||
|   | ||||
| @@ -1,87 +1,246 @@ | ||||
| <template> | ||||
|   <Filters @reset-form="data = []" @run-search="() => filterData(filters)" :report-button="true" class="mb-4"> | ||||
|   <Filters | ||||
|     @reset-form="data = []" | ||||
|     @run-search="() => filterData(filters)" | ||||
|     :report-button="true" | ||||
|     class="mb-4" | ||||
|   > | ||||
|     <Type2 @update:filters="(value) => (filters = value)" /> | ||||
|   </Filters> | ||||
|  | ||||
|   <div id="data"> | ||||
|     <DxDataGrid ref="dataGridRef" :allow-column-reordering="true" class="max-h-[calc(100vh-140px)] mb-10" | ||||
|       :data-source="data" :show-column-lines="true" :show-row-lines="false" :show-borders="true" | ||||
|       :row-alternation-enabled="true" :hover-state-enabled="true" @selection-changed="onSelectionChanged" | ||||
|       @exporting="onExporting" :allow-column-resizing="true" column-resizing-mode="widget" :word-wrap-enabled="true"> | ||||
|     <DxDataGrid | ||||
|       ref="dataGridRef" | ||||
|       :allow-column-reordering="true" | ||||
|       class="max-h-[calc(100vh-140px)] mb-10" | ||||
|       :data-source="data" | ||||
|       :show-column-lines="true" | ||||
|       :show-row-lines="false" | ||||
|       :show-borders="true" | ||||
|       :row-alternation-enabled="true" | ||||
|       :hover-state-enabled="true" | ||||
|       @selection-changed="onDataSelectionChanged" | ||||
|       @exporting="onExporting" | ||||
|       :allow-column-resizing="true" | ||||
|       column-resizing-mode="widget" | ||||
|       :word-wrap-enabled="true" | ||||
|     > | ||||
|       <DxGrouping expand-mode="rowClick" /> | ||||
|       <DxSelection mode="single" /> | ||||
|       <DxPaging :enabled="false" /> | ||||
|       <DxScrolling column-rendering-mode="virtual" mode="virtual" /> | ||||
|       <DxLoadPanel shading-color="rgba(0,0,0,0.4)" :position="position" :show-indicator="showIndicator" | ||||
|         :show-pane="showPane" :shading="shading" v-if="loading" v-model:visible="loading" :enabled="true" /> | ||||
|       <DxLoadPanel | ||||
|         shading-color="rgba(0,0,0,0.4)" | ||||
|         :position="position" | ||||
|         :show-indicator="showIndicator" | ||||
|         :show-pane="showPane" | ||||
|         :shading="shading" | ||||
|         v-model:visible="loadingData" | ||||
|         :enabled="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" /> | ||||
|  | ||||
|       <DxColumn alignment="center" :caption="`Periode: ${getMonthName(currentMonth)}, ${currentYear}`" | ||||
|         css-class="custom-table-column"> | ||||
|         <DxColumn alignment="center" :min-width="170" data-type="text" data-field="nama_regional" | ||||
|           caption="Nama Regional" css-class="custom-table-column" :group-index="0" /> | ||||
|         <DxColumn alignment="center" :min-width="170" data-type="text" data-field="nama_uid" caption="Nama UID" | ||||
|           css-class="custom-table-column" :group-index="1" /> | ||||
|         <DxColumn alignment="center" :min-width="170" data-type="text" data-field="nama_up3" caption="Nama UP3" | ||||
|           css-class="custom-table-column" :group-index="2" /> | ||||
|         <DxColumn alignment="center" :min-width="170" data-type="text" data-field="nama_ulp" caption="Nama Unit" | ||||
|           css-class="custom-table-column" name="namaULP" cell-template="formatText" /> | ||||
|       <DxColumn | ||||
|         alignment="center" | ||||
|         :caption="`Periode: ${getMonthName(currentMonth)}, ${currentYear}`" | ||||
|         css-class="custom-table-column" | ||||
|       > | ||||
|         <DxColumn | ||||
|           alignment="center" | ||||
|           :min-width="170" | ||||
|           data-type="text" | ||||
|           data-field="nama_regional" | ||||
|           caption="Nama Regional" | ||||
|           css-class="custom-table-column" | ||||
|           :group-index="0" | ||||
|         /> | ||||
|         <DxColumn | ||||
|           alignment="center" | ||||
|           :min-width="170" | ||||
|           data-type="text" | ||||
|           data-field="nama_uid" | ||||
|           caption="Nama UID" | ||||
|           css-class="custom-table-column" | ||||
|           :group-index="1" | ||||
|         /> | ||||
|         <DxColumn | ||||
|           alignment="center" | ||||
|           :min-width="170" | ||||
|           data-type="text" | ||||
|           data-field="nama_up3" | ||||
|           caption="Nama UP3" | ||||
|           css-class="custom-table-column" | ||||
|           :group-index="2" | ||||
|         /> | ||||
|         <DxColumn | ||||
|           alignment="center" | ||||
|           :min-width="170" | ||||
|           data-type="text" | ||||
|           data-field="nama_ulp" | ||||
|           caption="Nama Unit" | ||||
|           css-class="custom-table-column" | ||||
|           name="namaULP" | ||||
|           cell-template="formatText" | ||||
|         /> | ||||
|       </DxColumn> | ||||
|       <DxColumn alignment="center" caption="ENS (Distribusi)" css-class="custom-table-column"> | ||||
|         <DxColumn :width="150" alignment="center" data-field="terencana" data-type="number" caption="Terencana" | ||||
|           css-class="custom-table-column" cell-template="formatNumber" /> | ||||
|         <DxColumn :width="150" alignment="center" data-field="tidak_terencana" data-type="number" | ||||
|           caption="Tidak Terencana" css-class="custom-table-column" cell-template="formatNumber" /> | ||||
|         <DxColumn :width="150" alignment="center" data-field="bencana_alam" data-type="number" caption="Bencana Alam" | ||||
|           css-class="custom-table-column" cell-template="formatNumber" /> | ||||
|         <DxColumn | ||||
|           :width="150" | ||||
|           alignment="center" | ||||
|           data-field="terencana" | ||||
|           data-type="number" | ||||
|           caption="Terencana" | ||||
|           css-class="custom-table-column" | ||||
|           cell-template="formatNumber" | ||||
|         /> | ||||
|         <DxColumn | ||||
|           :width="150" | ||||
|           alignment="center" | ||||
|           data-field="tidak_terencana" | ||||
|           data-type="number" | ||||
|           caption="Tidak Terencana" | ||||
|           css-class="custom-table-column" | ||||
|           cell-template="formatNumber" | ||||
|         /> | ||||
|         <DxColumn | ||||
|           :width="150" | ||||
|           alignment="center" | ||||
|           data-field="bencana_alam" | ||||
|           data-type="number" | ||||
|           caption="Bencana Alam" | ||||
|           css-class="custom-table-column" | ||||
|           cell-template="formatNumber" | ||||
|         /> | ||||
|       </DxColumn> | ||||
|       <DxColumn :width="170" alignment="center" data-field="total" data-type="number" caption="Total" | ||||
|         css-class="custom-table-column" cell-template="formatNumber" /> | ||||
|       <DxColumn :min-width="170" alignment="center" data-field="kpi_ens" data-type="number" caption="KPI ENS" | ||||
|         css-class="custom-table-column" cell-template="formatNumber" /> | ||||
|       <DxColumn | ||||
|         :width="170" | ||||
|         alignment="center" | ||||
|         data-field="total" | ||||
|         data-type="number" | ||||
|         caption="Total" | ||||
|         css-class="custom-table-column" | ||||
|         cell-template="formatNumber" | ||||
|       /> | ||||
|       <DxColumn | ||||
|         :min-width="170" | ||||
|         alignment="center" | ||||
|         data-field="kpi_ens" | ||||
|         data-type="number" | ||||
|         caption="KPI ENS" | ||||
|         css-class="custom-table-column" | ||||
|         cell-template="formatNumber" | ||||
|       /> | ||||
|  | ||||
|       <DxSummary> | ||||
|         <DxTotalItem summary-type="sum" display-format="Total" show-in-column="nama_ulp" | ||||
|           css-class="text-white !text-left" /> | ||||
|         <DxTotalItem column="terencana" summary-type="sum" display-format="{0}" css-class="text-white !text-right" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxTotalItem column="tidak_terencana" summary-type="sum" display-format="{0}" css-class="text-white !text-right" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxTotalItem column="bencana_alam" summary-type="sum" display-format="{0}" css-class="text-white !text-right" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxTotalItem column="total" summary-type="sum" display-format="{0}" css-class="text-white !text-right" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxTotalItem column="kpi_ens" summary-type="sum" display-format="{0}" css-class="text-white !text-right" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxTotalItem | ||||
|           summary-type="sum" | ||||
|           display-format="Total" | ||||
|           show-in-column="nama_ulp" | ||||
|           css-class="text-white !text-left" | ||||
|         /> | ||||
|         <DxTotalItem | ||||
|           column="terencana" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           css-class="text-white !text-right" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|         <DxTotalItem | ||||
|           column="tidak_terencana" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           css-class="text-white !text-right" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|         <DxTotalItem | ||||
|           column="bencana_alam" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           css-class="text-white !text-right" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|         <DxTotalItem | ||||
|           column="total" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           css-class="text-white !text-right" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|         <DxTotalItem | ||||
|           column="kpi_ens" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           css-class="text-white !text-right" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|  | ||||
|         <DxGroupItem css-class="!text-right" show-in-column="terencana" :show-in-group-footer="false" | ||||
|           :align-by-column="true" column="terencana" summary-type="sum" display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxGroupItem css-class="!text-right" show-in-column="tidak_terencana" :show-in-group-footer="false" | ||||
|           :align-by-column="true" column="tidak_terencana" summary-type="sum" display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxGroupItem css-class="!text-right" show-in-column="bencana_alam" :show-in-group-footer="false" | ||||
|           :align-by-column="true" column="bencana_alam" summary-type="sum" display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxGroupItem css-class="!text-right" show-in-column="total" :show-in-group-footer="false" | ||||
|           :align-by-column="true" column="total" summary-type="sum" display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxGroupItem css-class="!text-right" show-in-column="kpi_ens" :show-in-group-footer="false" | ||||
|           :align-by-column="true" column="kpi_ens" summary-type="sum" display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxGroupItem | ||||
|           css-class="!text-right" | ||||
|           show-in-column="terencana" | ||||
|           :show-in-group-footer="false" | ||||
|           :align-by-column="true" | ||||
|           column="terencana" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|         <DxGroupItem | ||||
|           css-class="!text-right" | ||||
|           show-in-column="tidak_terencana" | ||||
|           :show-in-group-footer="false" | ||||
|           :align-by-column="true" | ||||
|           column="tidak_terencana" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|         <DxGroupItem | ||||
|           css-class="!text-right" | ||||
|           show-in-column="bencana_alam" | ||||
|           :show-in-group-footer="false" | ||||
|           :align-by-column="true" | ||||
|           column="bencana_alam" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|         <DxGroupItem | ||||
|           css-class="!text-right" | ||||
|           show-in-column="total" | ||||
|           :show-in-group-footer="false" | ||||
|           :align-by-column="true" | ||||
|           column="total" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|         <DxGroupItem | ||||
|           css-class="!text-right" | ||||
|           show-in-column="kpi_ens" | ||||
|           :show-in-group-footer="false" | ||||
|           :align-by-column="true" | ||||
|           column="kpi_ens" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|       </DxSummary> | ||||
|  | ||||
|       <template #formatNumber="{ data }"> | ||||
|         <p class="text-right cursor-pointer"> | ||||
|           {{ | ||||
|     isNumber(data.text) | ||||
|       ? data.column.caption == '%' | ||||
|         ? formatPercentage(data.text) | ||||
|         : formatNumber(data.text) | ||||
|       : data.text | ||||
|   }} | ||||
|             isNumber(data.text) | ||||
|               ? data.column.caption == '%' | ||||
|                 ? formatPercentage(data.text) | ||||
|                 : formatNumber(data.text) | ||||
|               : data.text | ||||
|           }} | ||||
|         </p> | ||||
|       </template> | ||||
|  | ||||
| @@ -95,7 +254,7 @@ | ||||
| </template> | ||||
|  | ||||
| <script setup lang="ts"> | ||||
| import { onMounted, ref } from 'vue' | ||||
| import { onMounted, ref, watch } from 'vue' | ||||
| import Filters from '@/components/Form/Filters.vue' | ||||
| import Type2 from '@/components/Form/FiltersType/Type2.vue' | ||||
| import { DxDataGrid } from 'devextreme-vue' | ||||
| @@ -122,12 +281,23 @@ import { useQuery } from '@vue/apollo-composable' | ||||
| import { queries } from '@/utils/api/api.graphql' | ||||
| import { getMonthName } from '@/utils/texts' | ||||
| import { formatNumber, formatPercentage, isNumber } from '@/utils/numbers' | ||||
| import { apolloClient } from '@/utils/api/api.graphql' | ||||
| import { provideApolloClient } from '@vue/apollo-composable' | ||||
|  | ||||
| const client = apolloClient() | ||||
| provideApolloClient(client) | ||||
| const position = { of: '#data' } | ||||
| const showIndicator = ref(true) | ||||
| const shading = ref(true) | ||||
| const showPane = ref(true) | ||||
| const data = ref<any[]>([]) | ||||
| const dataSub = ref<any[]>([]) | ||||
| const dataSelected = ref<any>() | ||||
| const dataSubSelected = ref<any>() | ||||
| const dialogDetail = ref(false) | ||||
| const closedialogDetail = () => (dialogDetail.value = false) | ||||
| const loadingData = ref(false) | ||||
| const loadingSubData = ref(false) | ||||
| const filters = ref() | ||||
| const currentYear = ref(new Date().getFullYear()) | ||||
| const currentMonth = ref(new Date().getMonth()) | ||||
| @@ -161,27 +331,66 @@ const onExporting = (e: any) => { | ||||
|     e.cancel = true | ||||
|   } | ||||
| } | ||||
| const getDetail = () => { | ||||
|   const dateValue = filters.value.periode.split(' s/d ') | ||||
|   const selected = dataSelected.value | ||||
|  | ||||
|   const query = { | ||||
|     dateFrom: dateValue[0] | ||||
|       ? dateValue[0].split('-').reverse().join('-') | ||||
|       : new Date().toISOString().slice(0, 10), | ||||
|     dateTo: dateValue[1] | ||||
|       ? dateValue[1].split('-').reverse().join('-') | ||||
|       : new Date().toISOString().slice(0, 10), | ||||
|     idUlp: selected?.id_ulp ? selected?.id_ulp : 0, | ||||
|     idUid: selected?.id_uid ? selected?.id_uid : 0, | ||||
|     idUp3: selected?.id_up3 ? selected?.id_up3 : 0 | ||||
|   } | ||||
|  | ||||
|   const { onResult, onError, loading } = useQuery( | ||||
|     queries.keluhan.rekap.rekapKeluhanAllDetail, | ||||
|     query | ||||
|   ) | ||||
|  | ||||
|   onResult((queryResult) => { | ||||
|     if (queryResult.data != undefined) { | ||||
|       dataSub.value = queryResult.data.detailKeluhanAll | ||||
|     } | ||||
|   }) | ||||
|  | ||||
|   onError((error) => { | ||||
|     console.log(error) | ||||
|   }) | ||||
|  | ||||
|   watch(loading, (value) => { | ||||
|     loadingSubData.value = value | ||||
|   }) | ||||
| } | ||||
|  | ||||
| const dataGridRef = ref<DxDataGrid | null>(null) | ||||
| const clearSelection = () => { | ||||
|   const dataGrid = dataGridRef.value!.instance! | ||||
|   dataGrid.clearSelection() | ||||
| } | ||||
| const onSelectionChanged = ({ selectedRowsData }: any) => { | ||||
|   const data = selectedRowsData[0] | ||||
| const showDetail = () => { | ||||
|   clearSelection() | ||||
|   dataSubSelected.value = null | ||||
|   dialogDetail.value = true | ||||
|   getDetail() | ||||
| } | ||||
|  | ||||
| const { onResult, onError, loading, refetch } = useQuery( | ||||
|   queries.monalisa.laporan.kumulatif.energyNotSalesKumulatif, | ||||
|   { | ||||
|     // regional: '', | ||||
|     idUlp: 0, | ||||
|     idUid: 0, | ||||
|     idUp3: 0, | ||||
|     bulan: currentMonth.value, | ||||
|     tahun: currentYear.value | ||||
| const onDataSelectionChanged = ({ selectedRowsData }: any) => { | ||||
|   if (selectedRowsData[0] != undefined) { | ||||
|     dataSelected.value = selectedRowsData[0] | ||||
|     showDetail() | ||||
|   } | ||||
| ) | ||||
| } | ||||
|  | ||||
| const onDataSubSelectionChanged = ({ selectedRowsData }: any) => { | ||||
|   const data = selectedRowsData[0] | ||||
|   dataSubSelected.value = data | ||||
| } | ||||
|  | ||||
| const filterData = (params: any) => { | ||||
|   const { regional, ulp, uid, up3, bulan, tahun } = params | ||||
|  | ||||
| @@ -189,25 +398,31 @@ const filterData = (params: any) => { | ||||
|   currentYear.value = tahun.id | ||||
|   lastYear.value = tahun.id - 1 | ||||
|  | ||||
|   refetch({ | ||||
|     // regional: regional, | ||||
|     idUlp: ulp ? ulp.id : 0, | ||||
|     idUid: uid ? uid.id : 0, | ||||
|     idUp3: up3 ? up3.id : 0, | ||||
|     bulan: bulan ? bulan.id : currentMonth.value, | ||||
|     tahun: bulan ? tahun.id : currentYear.value | ||||
|   }) | ||||
|   const { onResult, onError, loading, refetch } = useQuery( | ||||
|     queries.monalisa.laporan.kumulatif.energyNotSalesKumulatif, | ||||
|     { | ||||
|       namaRegional: regional.name == 'Semua Regional' ? '' : regional.name, | ||||
|       idUlp: ulp ? ulp.id : 0, | ||||
|       idUid: uid ? uid.id : 0, | ||||
|       idUp3: up3 ? up3.id : 0, | ||||
|       bulan: bulan ? bulan.id : currentMonth.value, | ||||
|       tahun: bulan ? tahun.id : currentYear.value | ||||
|     } | ||||
|   ) | ||||
|  | ||||
|   onResult((queryResult) => { | ||||
|     if (queryResult.data != undefined) { | ||||
|       data.value = queryResult.data.energyNotSalesKumulatif | ||||
|     } | ||||
|     console.log(queryResult.data) | ||||
|   }) | ||||
|  | ||||
|   onError((error) => { | ||||
|     console.log(error) | ||||
|   }) | ||||
|  | ||||
|   watch(loading, (value) => { | ||||
|     loadingData.value = value | ||||
|   }) | ||||
| } | ||||
|  | ||||
| onMounted(() => { | ||||
|   | ||||
| @@ -1,91 +1,252 @@ | ||||
| <template> | ||||
|   <Filters @reset-form="data = []" @run-search="() => filterData(filters)" :report-button="true" class="mb-4"> | ||||
|   <Filters | ||||
|     @reset-form="data = []" | ||||
|     @run-search="() => filterData(filters)" | ||||
|     :report-button="true" | ||||
|     class="mb-4" | ||||
|   > | ||||
|     <Type2 @update:filters="(value) => (filters = value)" /> | ||||
|   </Filters> | ||||
|  | ||||
|   <div id="data"> | ||||
|     <DxDataGrid ref="dataGridRef" :allow-column-reordering="true" class="max-h-[calc(100vh-140px)] mb-10" | ||||
|       :data-source="data" :show-column-lines="true" :show-row-lines="false" :show-borders="true" | ||||
|       :row-alternation-enabled="true" :hover-state-enabled="true" @selection-changed="onSelectionChanged" | ||||
|       @exporting="onExporting" :allow-column-resizing="true" column-resizing-mode="widget" :word-wrap-enabled="true"> | ||||
|     <DxDataGrid | ||||
|       ref="dataGridRef" | ||||
|       :allow-column-reordering="true" | ||||
|       class="max-h-[calc(100vh-140px)] mb-10" | ||||
|       :data-source="data" | ||||
|       :show-column-lines="true" | ||||
|       :show-row-lines="false" | ||||
|       :show-borders="true" | ||||
|       :row-alternation-enabled="true" | ||||
|       :hover-state-enabled="true" | ||||
|       @selection-changed="onDataSelectionChanged" | ||||
|       @exporting="onExporting" | ||||
|       :allow-column-resizing="true" | ||||
|       column-resizing-mode="widget" | ||||
|       :word-wrap-enabled="true" | ||||
|     > | ||||
|       <DxGrouping expand-mode="rowClick" /> | ||||
|       <DxSelection mode="single" /> | ||||
|       <DxPaging :enabled="false" /> | ||||
|       <DxScrolling column-rendering-mode="virtual" mode="virtual" /> | ||||
|       <DxLoadPanel shading-color="rgba(0,0,0,0.4)" :position="position" :show-indicator="showIndicator" | ||||
|         :show-pane="showPane" :shading="shading" v-if="loading" v-model:visible="loading" :enabled="true" /> | ||||
|       <DxLoadPanel | ||||
|         shading-color="rgba(0,0,0,0.4)" | ||||
|         :position="position" | ||||
|         :show-indicator="showIndicator" | ||||
|         :show-pane="showPane" | ||||
|         :shading="shading" | ||||
|         v-model:visible="loadingData" | ||||
|         :enabled="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" /> | ||||
|  | ||||
|       <DxColumn alignment="center" :min-width="170" data-type="text" data-field="nama_regional" caption="Nama Regional" | ||||
|         css-class="custom-table-column" :group-index="0" /> | ||||
|       <DxColumn alignment="center" :min-width="170" data-type="text" data-field="nama_uid" caption="Nama UID" | ||||
|         css-class="custom-table-column" :group-index="1" /> | ||||
|       <DxColumn alignment="center" :min-width="170" data-type="text" data-field="nama_up3" caption="Nama UP3" | ||||
|         css-class="custom-table-column" :group-index="2" /> | ||||
|       <DxColumn alignment="center" :min-width="170" data-type="text" data-field="nama_ulp" caption="Nama Unit" | ||||
|         css-class="custom-table-column" name="namaULP" cell-template="formatText" /> | ||||
|       <DxColumn alignment="center" caption="Kepatuhan dan Akurasi APKT" css-class="custom-table-column"> | ||||
|       <DxColumn | ||||
|         alignment="center" | ||||
|         :min-width="170" | ||||
|         data-type="text" | ||||
|         data-field="nama_regional" | ||||
|         caption="Nama Regional" | ||||
|         css-class="custom-table-column" | ||||
|         :group-index="0" | ||||
|       /> | ||||
|       <DxColumn | ||||
|         alignment="center" | ||||
|         :min-width="170" | ||||
|         data-type="text" | ||||
|         data-field="nama_uid" | ||||
|         caption="Nama UID" | ||||
|         css-class="custom-table-column" | ||||
|         :group-index="1" | ||||
|       /> | ||||
|       <DxColumn | ||||
|         alignment="center" | ||||
|         :min-width="170" | ||||
|         data-type="text" | ||||
|         data-field="nama_up3" | ||||
|         caption="Nama UP3" | ||||
|         css-class="custom-table-column" | ||||
|         :group-index="2" | ||||
|       /> | ||||
|       <DxColumn | ||||
|         alignment="center" | ||||
|         :min-width="170" | ||||
|         data-type="text" | ||||
|         data-field="nama_ulp" | ||||
|         caption="Nama Unit" | ||||
|         css-class="custom-table-column" | ||||
|         name="namaULP" | ||||
|         cell-template="formatText" | ||||
|       /> | ||||
|       <DxColumn | ||||
|         alignment="center" | ||||
|         caption="Kepatuhan dan Akurasi APKT" | ||||
|         css-class="custom-table-column" | ||||
|       > | ||||
|         <DxColumn alignment="center" caption="Gangguan Berulang" css-class="custom-table-column"> | ||||
|           <DxColumn :width="150" alignment="center" data-field="gangguan_berulang" data-type="number" | ||||
|             :caption="`s.d ${getMonthNameShort(currentMonth)} ${lastYear}`" css-class="custom-table-column" | ||||
|             cell-template="formatNumber" /> | ||||
|           <DxColumn :width="150" alignment="center" data-field="gangguan_total" data-type="number" | ||||
|             caption="Total Gangguan" css-class="custom-table-column" cell-template="formatNumber" /> | ||||
|           <DxColumn | ||||
|             :width="150" | ||||
|             alignment="center" | ||||
|             data-field="gangguan_berulang" | ||||
|             data-type="number" | ||||
|             :caption="`s.d ${getMonthNameShort(currentMonth)} ${lastYear}`" | ||||
|             css-class="custom-table-column" | ||||
|             cell-template="formatNumber" | ||||
|           /> | ||||
|           <DxColumn | ||||
|             :width="150" | ||||
|             alignment="center" | ||||
|             data-field="gangguan_total" | ||||
|             data-type="number" | ||||
|             caption="Total Gangguan" | ||||
|             css-class="custom-table-column" | ||||
|             cell-template="formatNumber" | ||||
|           /> | ||||
|         </DxColumn> | ||||
|         <DxColumn alignment="center" caption="Keluhan Berulang" css-class="custom-table-column"> | ||||
|           <DxColumn :width="150" alignment="center" data-field="keluhan_berulang" data-type="number" | ||||
|             :caption="` s.d ${getMonthNameShort(currentMonth)} ${currentYear}`" css-class="custom-table-column" | ||||
|             cell-template="formatNumber" /> | ||||
|           <DxColumn :width="150" alignment="center" data-field="keluhan_total" data-type="number" | ||||
|             caption="Total Keluhan" css-class="custom-table-column" cell-template="formatNumber" /> | ||||
|           <DxColumn | ||||
|             :width="150" | ||||
|             alignment="center" | ||||
|             data-field="keluhan_berulang" | ||||
|             data-type="number" | ||||
|             :caption="` s.d ${getMonthNameShort(currentMonth)} ${currentYear}`" | ||||
|             css-class="custom-table-column" | ||||
|             cell-template="formatNumber" | ||||
|           /> | ||||
|           <DxColumn | ||||
|             :width="150" | ||||
|             alignment="center" | ||||
|             data-field="keluhan_total" | ||||
|             data-type="number" | ||||
|             caption="Total Keluhan" | ||||
|             css-class="custom-table-column" | ||||
|             cell-template="formatNumber" | ||||
|           /> | ||||
|         </DxColumn> | ||||
|       </DxColumn> | ||||
|       <DxColumn :min-width="150" alignment="center" data-field="komplain_pelanggan" data-type="number" | ||||
|         caption="Komplain Pelanggan %" css-class="custom-table-column" cell-template="formatPercentage" /> | ||||
|       <DxColumn | ||||
|         :min-width="150" | ||||
|         alignment="center" | ||||
|         data-field="komplain_pelanggan" | ||||
|         data-type="number" | ||||
|         caption="Komplain Pelanggan %" | ||||
|         css-class="custom-table-column" | ||||
|         cell-template="formatPercentage" | ||||
|       /> | ||||
|  | ||||
|       <DxSummary> | ||||
|         <DxTotalItem summary-type="sum" display-format="Total" show-in-column="nama_ulp" | ||||
|           css-class="text-white !text-left" /> | ||||
|         <DxTotalItem column="gangguan_berulang" summary-type="sum" display-format="{0}" | ||||
|           css-class="text-white !text-right" :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxTotalItem column="gangguan_total" summary-type="sum" display-format="{0}" css-class="text-white !text-right" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxTotalItem column="keluhan_berulang" summary-type="sum" display-format="{0}" | ||||
|           css-class="text-white !text-right" :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxTotalItem column="keluhan_total" summary-type="sum" display-format="{0}" css-class="text-white !text-right" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxTotalItem column="komplain_pelanggan" summary-type="sum" display-format="{0}" | ||||
|           css-class="text-white !text-right" :customize-text="(e: any) => (parseFloat(e.value.toString()) ? formatPercentage(e.value) : '0%') | ||||
|     " /> | ||||
|         <DxTotalItem | ||||
|           summary-type="sum" | ||||
|           display-format="Total" | ||||
|           show-in-column="nama_ulp" | ||||
|           css-class="text-white !text-left" | ||||
|         /> | ||||
|         <DxTotalItem | ||||
|           column="gangguan_berulang" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           css-class="text-white !text-right" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|         <DxTotalItem | ||||
|           column="gangguan_total" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           css-class="text-white !text-right" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|         <DxTotalItem | ||||
|           column="keluhan_berulang" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           css-class="text-white !text-right" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|         <DxTotalItem | ||||
|           column="keluhan_total" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           css-class="text-white !text-right" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|         <DxTotalItem | ||||
|           column="komplain_pelanggan" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           css-class="text-white !text-right" | ||||
|           :customize-text=" | ||||
|             (e: any) => (parseFloat(e.value.toString()) ? formatPercentage(e.value) : '0%') | ||||
|           " | ||||
|         /> | ||||
|  | ||||
|         <DxGroupItem css-class="!text-right" show-in-column="gangguan_berulang" :show-in-group-footer="false" | ||||
|           :align-by-column="true" column="gangguan_berulang" summary-type="sum" display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxGroupItem css-class="!text-right" show-in-column="gangguan_total" :show-in-group-footer="false" | ||||
|           :align-by-column="true" column="gangguan_total" summary-type="sum" display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxGroupItem css-class="!text-right" show-in-column="keluhan_berulang" :show-in-group-footer="false" | ||||
|           :align-by-column="true" column="keluhan_berulang" summary-type="sum" display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxGroupItem css-class="!text-right" show-in-column="keluhan_total" :show-in-group-footer="false" | ||||
|           :align-by-column="true" column="keluhan_total" summary-type="sum" display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" /> | ||||
|         <DxGroupItem css-class="!text-right" show-in-column="komplain_pelanggan" :show-in-group-footer="false" | ||||
|           :align-by-column="true" column="komplain_pelanggan" summary-type="sum" display-format="{0}" :customize-text="(e: any) => (parseFloat(e.value.toString()) ? formatPercentage(e.value) : '0%') | ||||
|     " /> | ||||
|         <DxGroupItem | ||||
|           css-class="!text-right" | ||||
|           show-in-column="gangguan_berulang" | ||||
|           :show-in-group-footer="false" | ||||
|           :align-by-column="true" | ||||
|           column="gangguan_berulang" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|         <DxGroupItem | ||||
|           css-class="!text-right" | ||||
|           show-in-column="gangguan_total" | ||||
|           :show-in-group-footer="false" | ||||
|           :align-by-column="true" | ||||
|           column="gangguan_total" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|         <DxGroupItem | ||||
|           css-class="!text-right" | ||||
|           show-in-column="keluhan_berulang" | ||||
|           :show-in-group-footer="false" | ||||
|           :align-by-column="true" | ||||
|           column="keluhan_berulang" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|         <DxGroupItem | ||||
|           css-class="!text-right" | ||||
|           show-in-column="keluhan_total" | ||||
|           :show-in-group-footer="false" | ||||
|           :align-by-column="true" | ||||
|           column="keluhan_total" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           :customize-text="(e: any) => formatNumber(e.value)" | ||||
|         /> | ||||
|         <DxGroupItem | ||||
|           css-class="!text-right" | ||||
|           show-in-column="komplain_pelanggan" | ||||
|           :show-in-group-footer="false" | ||||
|           :align-by-column="true" | ||||
|           column="komplain_pelanggan" | ||||
|           summary-type="sum" | ||||
|           display-format="{0}" | ||||
|           :customize-text=" | ||||
|             (e: any) => (parseFloat(e.value.toString()) ? formatPercentage(e.value) : '0%') | ||||
|           " | ||||
|         /> | ||||
|       </DxSummary> | ||||
|  | ||||
|       <template #formatNumber="{ data }"> | ||||
|         <p class="text-right cursor-pointer"> | ||||
|           {{ | ||||
|     isNumber(data.text) | ||||
|       ? data.column.caption == '%' | ||||
|         ? formatPercentage(data.text) | ||||
|         : formatNumber(data.text) | ||||
|       : data.text | ||||
|   }} | ||||
|             isNumber(data.text) | ||||
|               ? data.column.caption == '%' | ||||
|                 ? formatPercentage(data.text) | ||||
|                 : formatNumber(data.text) | ||||
|               : data.text | ||||
|           }} | ||||
|         </p> | ||||
|       </template> | ||||
|  | ||||
| @@ -107,7 +268,7 @@ | ||||
| <script setup lang="ts"> | ||||
| import Filters from '@/components/Form/Filters.vue' | ||||
| import Type2 from '@/components/Form/FiltersType/Type2.vue' | ||||
| import { onMounted, ref } from 'vue' | ||||
| import { onMounted, ref, watch } from 'vue' | ||||
| import { DxDataGrid } from 'devextreme-vue' | ||||
| import { | ||||
|   DxColumn, | ||||
| @@ -132,12 +293,23 @@ import { useQuery } from '@vue/apollo-composable' | ||||
| import { queries } from '@/utils/api/api.graphql' | ||||
| import { getMonthNameShort } from '@/utils/texts' | ||||
| import { formatNumber, formatPercentage, isNumber } from '@/utils/numbers' | ||||
| import { apolloClient } from '@/utils/api/api.graphql' | ||||
| import { provideApolloClient } from '@vue/apollo-composable' | ||||
|  | ||||
| const client = apolloClient() | ||||
| provideApolloClient(client) | ||||
| const position = { of: '#data' } | ||||
| const showIndicator = ref(true) | ||||
| const shading = ref(true) | ||||
| const showPane = ref(true) | ||||
| const data = ref<any[]>([]) | ||||
| const dataSub = ref<any[]>([]) | ||||
| const dataSelected = ref<any>() | ||||
| const dataSubSelected = ref<any>() | ||||
| const dialogDetail = ref(false) | ||||
| const closedialogDetail = () => (dialogDetail.value = false) | ||||
| const loadingData = ref(false) | ||||
| const loadingSubData = ref(false) | ||||
| const currentYear = ref(new Date().getFullYear()) | ||||
| const currentMonth = ref(new Date().getMonth()) | ||||
| const lastYear = ref(currentYear.value - 1) | ||||
| @@ -171,27 +343,65 @@ const onExporting = (e: any) => { | ||||
|     e.cancel = true | ||||
|   } | ||||
| } | ||||
| const getDetail = () => { | ||||
|   const dateValue = filters.value.periode.split(' s/d ') | ||||
|   const selected = dataSelected.value | ||||
|  | ||||
|   const query = { | ||||
|     dateFrom: dateValue[0] | ||||
|       ? dateValue[0].split('-').reverse().join('-') | ||||
|       : new Date().toISOString().slice(0, 10), | ||||
|     dateTo: dateValue[1] | ||||
|       ? dateValue[1].split('-').reverse().join('-') | ||||
|       : new Date().toISOString().slice(0, 10), | ||||
|     idUlp: selected?.id_ulp ? selected?.id_ulp : 0, | ||||
|     idUid: selected?.id_uid ? selected?.id_uid : 0, | ||||
|     idUp3: selected?.id_up3 ? selected?.id_up3 : 0 | ||||
|   } | ||||
|  | ||||
|   const { onResult, onError, loading } = useQuery( | ||||
|     queries.keluhan.rekap.rekapKeluhanAllDetail, | ||||
|     query | ||||
|   ) | ||||
|  | ||||
|   onResult((queryResult) => { | ||||
|     if (queryResult.data != undefined) { | ||||
|       dataSub.value = queryResult.data.detailKeluhanAll | ||||
|     } | ||||
|   }) | ||||
|  | ||||
|   onError((error) => { | ||||
|     console.log(error) | ||||
|   }) | ||||
|  | ||||
|   watch(loading, (value) => { | ||||
|     loadingSubData.value = value | ||||
|   }) | ||||
| } | ||||
|  | ||||
| const dataGridRef = ref<DxDataGrid | null>(null) | ||||
| const clearSelection = () => { | ||||
|   const dataGrid = dataGridRef.value!.instance! | ||||
|   dataGrid.clearSelection() | ||||
| } | ||||
| const onSelectionChanged = ({ selectedRowsData }: any) => { | ||||
|   const data = selectedRowsData[0] | ||||
| const showDetail = () => { | ||||
|   clearSelection() | ||||
|   dataSubSelected.value = null | ||||
|   dialogDetail.value = true | ||||
|   getDetail() | ||||
| } | ||||
|  | ||||
| const { onResult, onError, loading, refetch } = useQuery( | ||||
|   queries.monalisa.laporan.kumulatif.kepatuhandanAkurasiDalamPelaporanKumulatif, | ||||
|   { | ||||
|     // regional: '', | ||||
|     idUlp: 0, | ||||
|     idUid: 0, | ||||
|     idUp3: 0, | ||||
|     bulan: currentMonth.value, | ||||
|     tahun: currentYear.value | ||||
| const onDataSelectionChanged = ({ selectedRowsData }: any) => { | ||||
|   if (selectedRowsData[0] != undefined) { | ||||
|     dataSelected.value = selectedRowsData[0] | ||||
|     showDetail() | ||||
|   } | ||||
| ) | ||||
| } | ||||
|  | ||||
| const onDataSubSelectionChanged = ({ selectedRowsData }: any) => { | ||||
|   const data = selectedRowsData[0] | ||||
|   dataSubSelected.value = data | ||||
| } | ||||
|  | ||||
| const filterData = (params: any) => { | ||||
|   const { regional, ulp, uid, up3, bulan, tahun } = params | ||||
| @@ -200,25 +410,31 @@ const filterData = (params: any) => { | ||||
|   currentYear.value = tahun.id | ||||
|   lastYear.value = tahun.id - 1 | ||||
|  | ||||
|   refetch({ | ||||
|     // regional: regional, | ||||
|     idUlp: ulp ? ulp.id : 0, | ||||
|     idUid: uid ? uid.id : 0, | ||||
|     idUp3: up3 ? up3.id : 0, | ||||
|     bulan: bulan ? bulan.id : currentMonth.value, | ||||
|     tahun: bulan ? tahun.id : currentYear.value | ||||
|   }) | ||||
|   const { onResult, onError, loading, refetch } = useQuery( | ||||
|     queries.monalisa.laporan.kumulatif.kepatuhandanAkurasiDalamPelaporanKumulatif, | ||||
|     { | ||||
|       namaRegional: regional.name == 'Semua Regional' ? '' : regional.name, | ||||
|       idUlp: ulp ? ulp.id : 0, | ||||
|       idUid: uid ? uid.id : 0, | ||||
|       idUp3: up3 ? up3.id : 0, | ||||
|       bulan: bulan ? bulan.id : currentMonth.value, | ||||
|       tahun: bulan ? tahun.id : currentYear.value | ||||
|     } | ||||
|   ) | ||||
|  | ||||
|   onResult((queryResult) => { | ||||
|     if (queryResult.data != undefined) { | ||||
|       data.value = queryResult.data.kepatuhandanAkurasiDalamPelaporanKumulatif | ||||
|     } | ||||
|     console.log(queryResult.data) | ||||
|   }) | ||||
|  | ||||
|   onError((error) => { | ||||
|     console.log(error) | ||||
|   }) | ||||
|  | ||||
|   watch(loading, (value) => { | ||||
|     loadingData.value = value | ||||
|   }) | ||||
| } | ||||
|  | ||||
| onMounted(() => { | ||||
|   | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Reference in New Issue
	
	Block a user