Compare commits

..

9 Commits

Author SHA1 Message Date
Dede Fuji Abdul
40680c9040 chore: Bump version to 0.0.193-vm and update npm dependencies 2024-05-17 20:11:22 +07:00
kur0nek-o
5fd6e7a86c fix: laporan cico 2024-05-14 15:12:58 +07:00
kur0nek-o
fea148b487 fix: monalisa filter ulp 2024-05-11 10:45:39 +07:00
kur0nek-o
288201f25c fix: transaksi 2024-05-10 21:28:07 +07:00
kur0nek-o
3c8ccfe6a1 fix: problem 2024-05-10 14:19:13 +07:00
kur0nek-o
8e7a3caab8 fix: daftar gangguan dialihkan posko lain, daftar keluhan lapor lebih dari 1 kali, keluhan selesai di cc 2024-05-09 17:39:29 +07:00
kur0nek-o
3f53f68257 change version 2024-05-08 16:17:37 +07:00
kur0nek-o
6848a91efd Merge branch 'development' of github.com:defuj/eis into development 2024-05-08 16:15:58 +07:00
kur0nek-o
d726b88045 fix: detail keluhan dialihkan ke unit lain 2024-05-08 16:15:24 +07:00
13 changed files with 111 additions and 74 deletions

View File

@ -1 +1 @@
{"name":"eis","version":"0.0.187-vm","private":true,"scripts":{"dev":"vite","host":"vite --host","tailwind":"tailwindcss -i ./src/assets/css/tailwind.css -o ./src/assets/css/style.css --watch","build":"run-p type-check build-only","preview":"vite preview --host","test:unit":"vitest","build-only":"vite build","type-check":"vue-tsc --noEmit -p tsconfig.vitest.json --composite false","lint":"eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore","format":"prettier --write src/","deploy":"node deploy.js","set-version":"node version.js","version":"echo $npm_package_version"},"dependencies":{"@apollo/client":"^3.8.10","@apollo/link-context":"^2.0.0-beta.3","@flavorly/vanilla-components":"^0.7.65","@headlessui/tailwindcss":"^0.2.0","@headlessui/vue":"^1.7.19","@heroicons/vue":"^2.0.18","@lottiefiles/lottie-player":"^2.0.4","@phosphor-icons/vue":"^2.1.6","@types/qs":"^6.9.12","@types/uuid":"^9.0.8","@types/vue-select":"^3.16.8","@vue/apollo-components":"^4.0.0","@vue/apollo-composable":"^4.0.1","@vue/apollo-option":"^4.0.0","axios":"^1.6.7","devextreme":"23.2.4","devextreme-vue":"23.2.4","docx":"^8.5.0","dotenv":"^16.3.1","encrypt-storage":"^2.12.22","exceljs":"^4.4.0","file-saver":"^2.0.5","graphql":"^16.8.1","graphql-tag":"^2.12.6","jspdf":"^2.5.1","jspdf-autotable":"^3.8.2","pinia":"^2.1.3","qs":"^6.11.2","uuid":"^9.0.1","vue":"^3.3.4","vue-html-to-paper":"^2.0.3","vue-router":"^4.2.2","vue-tailwind-datepicker":"^1.6.1","vue3-star-ratings":"^3.0.5"},"devDependencies":{"@rushstack/eslint-patch":"^1.5.1","@tailwindcss/aspect-ratio":"^0.4.2","@tailwindcss/container-queries":"^0.1.1","@tailwindcss/forms":"^0.5.7","@tailwindcss/typography":"^0.5.10","@tsconfig/node18":"^2.0.1","@types/file-saver":"^2.0.6","@types/jsdom":"^21.1.1","@types/node":"^18.16.17","@vitejs/plugin-vue":"^4.2.3","@vitejs/plugin-vue-jsx":"^3.0.1","@vue/eslint-config-prettier":"^8.0.0","@vue/eslint-config-typescript":"^12.0.0","@vue/test-utils":"^2.3.2","@vue/tsconfig":"^0.4.0","autoprefixer":"^10.4.14","eslint":"^8.39.0","eslint-plugin-vue":"^9.11.0","jsdom":"^22.1.0","npm-run-all":"^4.1.5","postcss":"^8.4.24","prettier":"^3.0.3","tailwindcss":"^3.3.2","typescript":"~5.2.2","vite":"^4.3.9","vitest":"^1.3.1","vue-tsc":"^2.0.5"}}
{"name":"eis","version":"0.0.193-vm","private":true,"scripts":{"dev":"vite","host":"vite --host","tailwind":"tailwindcss -i ./src/assets/css/tailwind.css -o ./src/assets/css/style.css --watch","build":"run-p type-check build-only","preview":"vite preview --host","test:unit":"vitest","build-only":"vite build","type-check":"vue-tsc --noEmit -p tsconfig.vitest.json --composite false","lint":"eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore","format":"prettier --write src/","deploy":"node deploy.js","set-version":"node version.js","version":"echo $npm_package_version"},"dependencies":{"@apollo/client":"^3.8.10","@apollo/link-context":"^2.0.0-beta.3","@flavorly/vanilla-components":"^0.7.65","@headlessui/tailwindcss":"^0.2.0","@headlessui/vue":"^1.7.19","@heroicons/vue":"^2.0.18","@lottiefiles/lottie-player":"^2.0.4","@phosphor-icons/vue":"^2.1.6","@types/qs":"^6.9.12","@types/uuid":"^9.0.8","@types/vue-select":"^3.16.8","@vue/apollo-components":"^4.0.0","@vue/apollo-composable":"^4.0.1","@vue/apollo-option":"^4.0.0","axios":"^1.6.7","devextreme":"23.2.4","devextreme-vue":"23.2.4","docx":"^8.5.0","dotenv":"^16.3.1","encrypt-storage":"^2.12.22","exceljs":"^4.4.0","file-saver":"^2.0.5","graphql":"^16.8.1","graphql-tag":"^2.12.6","jspdf":"^2.5.1","jspdf-autotable":"^3.8.2","pinia":"^2.1.3","qs":"^6.11.2","uuid":"^9.0.1","vue":"^3.3.4","vue-html-to-paper":"^2.0.3","vue-router":"^4.2.2","vue-tailwind-datepicker":"^1.6.1","vue3-star-ratings":"^3.0.5"},"devDependencies":{"@rushstack/eslint-patch":"^1.5.1","@tailwindcss/aspect-ratio":"^0.4.2","@tailwindcss/container-queries":"^0.1.1","@tailwindcss/forms":"^0.5.7","@tailwindcss/typography":"^0.5.10","@tsconfig/node18":"^2.0.1","@types/file-saver":"^2.0.6","@types/jsdom":"^21.1.1","@types/node":"^18.16.17","@vitejs/plugin-vue":"^4.2.3","@vitejs/plugin-vue-jsx":"^3.0.1","@vue/eslint-config-prettier":"^8.0.0","@vue/eslint-config-typescript":"^12.0.0","@vue/test-utils":"^2.3.2","@vue/tsconfig":"^0.4.0","autoprefixer":"^10.4.14","eslint":"^8.39.0","eslint-plugin-vue":"^9.11.0","jsdom":"^22.1.0","npm-run-all":"^4.1.5","postcss":"^8.4.24","prettier":"^3.0.3","tailwindcss":"^3.3.2","typescript":"~5.2.2","vite":"^4.3.9","vitest":"^1.3.1","vue-tsc":"^2.0.5"}}

View File

@ -1 +1 @@
{"version":"0.0.187-vm"}
{"version":"0.0.193-vm"}

View File

@ -5,7 +5,7 @@ import {
selectedUid,
selectedUp3Ulp,
fetchRegional,
fetchUid,
selectedRegional,
itemsUid,
itemsUp3,
itemsUlp,
@ -67,11 +67,7 @@ watch(data, (value) => {
})
const setRegional = (value: any) => {
if (!presetUID.value) {
fetchUid()
selectedUid(value)
}
selectedRegional(value)
data.value = {
...data.value,
regional: value
@ -119,7 +115,6 @@ const setUp3 = (value: any) => {
}
const setUlp = (value: any) => {
selectedUp3Ulp(value)
data.value = {
...data.value,
ulp: value
@ -160,7 +155,6 @@ onMounted(() => {
})
} else {
fetchRegional()
fetchUid()
}
emit('update:filters', data.value)

View File

@ -132,6 +132,11 @@ const fetchDataPosko = async (up3: number) => {
}
}
const fetchRegional = async () => {
itemsUid.value = []
itemsUp3.value = []
itemsPosko.value = []
itemsUlp.value = []
try {
const res = await getRegional()
itemsRegional.value = res.data.map((item: any) => ({
@ -157,6 +162,13 @@ const formatWaktu = (durasiDetik: any): string => {
return `${hari} - ${jam} : ${menit} : ${detik}`
}
}
const selectedRegional = (value: any) => {
fetchUidByRegional(value.id)
itemsUid.value = []
itemsUp3.value = []
itemsPosko.value = []
itemsUlp.value = []
}
const selectedUid = (value: any) => {
fetchDataUp3(value.id)
@ -203,5 +215,6 @@ export {
itemsUlp,
months,
years,
formatWaktu
formatWaktu,
selectedRegional
}

View File

@ -1240,7 +1240,8 @@ const getDetail = async () => {
idPosko: posko ? posko.id : 0,
idUid: uid ? uid.id : 0,
idUp3: up3 ? up3.id : 0,
personilYantek: isTotal.value ? '' : selected?.personil_yantek ? selected?.personil_yantek : ''
personilYantek: isTotal.value ? '' : selected?.personil_yantek ? selected?.personil_yantek : '',
userRegu: isTotal.value ? '' : selected?.user_regu ? selected?.user_regu : ''
}
loadingSubData.value = true

View File

@ -312,7 +312,7 @@
</div>
<div class="flex flex-row items-center justify-between w-full">
<h3 class="text-sm font-medium w-[170px] text-gray-800">Pembuat Laporan:</h3>
<h3 class="text-sm font-medium w-[170px] text-gray-800">No Telp Pelapor:</h3>
<InputText :readonly="true" :value="dataSelected?.no_telp_pelapor" class-name="flex-1" />
</div>
@ -327,7 +327,7 @@
</div>
<div class="flex flex-row items-center justify-between w-full">
<h3 class="text-sm font-medium w-[170px] text-gray-800">Posko:</h3>
<h3 class="text-sm font-medium w-[170px] text-gray-800">Unit Layanan Pelanggan:</h3>
<InputText :readonly="true" :value="dataSelected?.nama_posko_lama" class-name="flex-1" />
</div>
</div>

View File

@ -232,11 +232,21 @@
<InputText :readonly="true" :value="dataSelected.no_laporan" class-name="flex-1" />
</div>
<div class="flex flex-row items-center justify-between w-full">
<h3 class="text-sm font-medium w-[170px] text-gray-800">Pembuat Laporan:</h3>
<InputText :readonly="true" :value="dataSelected.pembuat_laporan" class-name="flex-1" />
</div>
<div class="flex flex-row items-center justify-between w-full">
<h3 class="text-sm font-medium w-[170px] text-gray-800">Tgl Lapor:</h3>
<InputText :readonly="true" :value="dataSelected?.waktu_lapor" class-name="flex-1" />
</div>
<div class="flex flex-row items-center justify-between w-full">
<h3 class="text-sm font-medium w-[170px] text-gray-800">Tgl Dialihkan:</h3>
<InputText :readonly="true" :value="dataSelected?.waktu_dialihkan" class-name="flex-1" />
</div>
<div class="flex flex-row items-center justify-between w-full">
<h3 class="text-sm font-medium w-[170px] text-gray-800">Tgl Response:</h3>
<InputText :readonly="true" :value="dataSelected?.waktu_response" class-name="flex-1" />
@ -247,6 +257,19 @@
<InputText :readonly="true" :value="dataSelected?.waktu_recovery" class-name="flex-1" />
</div>
<div class="flex flex-row items-center justify-between w-full">
<h3 class="text-sm font-medium w-[170px] text-gray-800">Recovery Time:</h3>
<InputText
:readonly="true"
class-name="flex-1"
:value="
parseInt(dataSelected?.durasi_recovery_time)
? formatWaktu(dataSelected?.durasi_recovery_time)
: '-'
"
/>
</div>
<div class="flex flex-row items-center justify-between w-full">
<h3 class="text-sm font-medium w-[170px] text-gray-800">Response Time:</h3>
<InputText
@ -261,16 +284,13 @@
</div>
<div class="flex flex-row items-center justify-between w-full">
<h3 class="text-sm font-medium w-[170px] text-gray-800">Recovery Time:</h3>
<InputText
:readonly="true"
class-name="flex-1"
:value="
parseInt(dataSelected?.durasi_recovery_time)
? formatWaktu(dataSelected?.durasi_recovery_time)
: '-'
"
/>
<h3 class="text-sm font-medium w-[170px] text-gray-800">Unit Asal :</h3>
<InputText :readonly="true" :value="dataSelected?.nama_unit_lama" class-name="flex-1" />
</div>
<div class="flex flex-row items-center justify-between w-full">
<h3 class="text-sm font-medium w-[170px] text-gray-800">Unit Tujuan :</h3>
<InputText :readonly="true" :value="dataSelected?.nama_unit_baru" class-name="flex-1" />
</div>
<div class="flex flex-row items-center justify-between w-full">

View File

@ -79,7 +79,7 @@
<DxColumn
:width="170"
alignment="center"
data-field="waktu_selesai"
data-field="waktu_recovery"
caption="Tgl Recovery"
css-class="custom-table-column"
cell-template="formatText"
@ -195,7 +195,7 @@
<DetailDialog
:open="dialogDetail"
:title="detailType == 'table' ? 'Daftar Lapor ULang' : 'Detail Gangguan'"
:title="detailType == 'table' ? 'Daftar Lapor Ulang' : 'Detail Keluhan'"
@on-close="closeDialog"
:full-width="detailType == 'table'"
>
@ -217,7 +217,7 @@
<div class="flex flex-row items-center justify-between w-full">
<h3 class="text-sm font-medium w-[170px] text-gray-800">Tanggal Recovery:</h3>
<InputText :readonly="true" :value="dataSelected?.waktu_selesai" class-name="flex-1" />
<InputText :readonly="true" :value="dataSelected?.waktu_recovery" class-name="flex-1" />
</div>
<div class="flex flex-row items-center justify-between w-full">

View File

@ -75,6 +75,14 @@
css-class="custom-table-column !align-top"
cell-template="formatText"
/>
<DxColumn
:width="170"
alignment="center"
data-field="nama_up3"
caption="UP3"
css-class="custom-table-column !align-top"
cell-template="formatText"
/>
<DxColumn
:width="170"
alignment="center"
@ -136,11 +144,19 @@
<DxColumn
:width="150"
alignment="center"
data-field="nama_pelapor"
data-field="pembuat_laporan"
caption="Created By"
css-class="custom-table-column !align-top"
cell-template="formatText"
/>
<DxColumn
:width="170"
alignment="center"
data-field="waktu_lapor"
caption="Tgl Lapor"
css-class="custom-table-column !align-top"
cell-template="formatText"
/>
<DxColumn
:width="170"
alignment="center"
@ -215,7 +231,7 @@
<div class="flex flex-row items-center justify-between w-full">
<h3 class="text-sm font-medium w-[170px] text-gray-800">Contact Center:</h3>
<InputText :readonly="true" :value="dataSelected?.media" class-name="flex-1" />
<InputText :readonly="true" :value="dataSelected?.nama_ulp" class-name="flex-1" />
</div>
<div class="flex flex-row items-center justify-between w-full">
@ -294,6 +310,11 @@
<h3 class="text-sm font-medium w-[170px] text-gray-800">Jumlah Lapor Ulang:</h3>
<InputText :readonly="true" :value="dataSelected?.jumlah_lapor" class-name="flex-1" />
</div>
<div class="flex flex-row items-center justify-between w-full">
<h3 class="text-sm font-medium w-[170px] text-gray-800">Sumber Lapor:</h3>
<InputText :readonly="true" :value="dataSelected?.media" class-name="flex-1" />
</div>
</div>
</DetailDialog>
</template>

View File

@ -69,6 +69,15 @@
css-class="custom-table-column"
cell-template="formatNumber"
/>
<DxColumn
:width="100"
alignment="center"
data-field="total"
data-type="number"
caption="Total"
css-class="custom-table-column"
cell-template="formatNumber"
/>
</DxColumn>
<DxSummary>

View File

@ -46,9 +46,9 @@
:width="50"
alignment="center"
data-type="number"
data-field="number"
caption="No"
cell-template="formatNumber"
:calculate-display-value="(item: any) => data.findIndex((i) => i == item) + 1"
/>
<DxColumn
:width="170"
@ -1175,14 +1175,7 @@ const filterData = async (params: any) => {
await requestGraphQl(queries.keluhan.rekap.keluhanPerJenisKeluhan, query)
.then((result) => {
if (result.data.data != undefined) {
data.value = [...result.data.data.rekapitulasiKeluhanPerJenisKeluhan]
.sort((a: any, b: any) => a.tipe_keluhan.localeCompare(b.tipe_keluhan))
.map((item: any, index: number) => {
return {
...item,
number: index + 1
}
})
data.value = result.data.data.rekapitulasiKeluhanPerJenisKeluhan
} else {
data.value = []
}
@ -1393,13 +1386,6 @@ onMounted(() => {
total_diatas_sla_recovery: 2
}
]
.sort((a: any, b: any) => a.tipe_keluhan.localeCompare(b.tipe_keluhan))
.map((item: any, index: number) => {
return {
...item,
number: index + 1
}
})
}
})
</script>

View File

@ -1,7 +1,7 @@
<template>
<div class="flex flex-row items-center w-full mb-6 space-x-4">
<button
@click="tab = 'gangguan'"
@click="changeTab('gangguan')"
type="button"
class="px-1 py-4 text-sm"
:class="[
@ -13,7 +13,7 @@
Gangguan: Transaksi Aktif > SLA
</button>
<button
@click="tab = 'keluhan'"
@click="changeTab('keluhan')"
type="button"
class="px-1 py-4 text-sm"
:class="[
@ -179,7 +179,6 @@
cell-template="formatText"
/>
<DxColumn
v-if="tab == 'keluhan'"
:width="170"
alignment="center"
data-field="status_akhir"
@ -188,7 +187,6 @@
cell-template="formatText"
/>
<DxColumn
v-if="tab == 'keluhan'"
:width="170"
alignment="center"
data-field="durasi_time"
@ -196,6 +194,14 @@
css-class="custom-table-column"
cell-template="formatTime"
/>
<DxColumn
:width="170"
alignment="center"
data-field="email_pelapor"
caption="Email"
css-class="custom-table-column"
cell-template="formatText"
/>
<template #formatText="{ data }">
<p class="text-left">
@ -274,6 +280,11 @@ const reportMeta = ref({
periode: ''
})
const changeTab = (newTab: string) => {
tab.value = newTab
data.value = []
}
const formatMetaData = (reportMeta: any) => {
const periode = reportMeta.periode ? reportMeta.periode.split(' s/d ') : ''
@ -305,31 +316,12 @@ const onExporting = (e: any) => {
const worksheet = workbook.addWorksheet('Transaksi APKT')
setHeaderStyle(worksheet, 1, 1, 'PT. PLN(Persero)')
setHeaderStyle(
worksheet,
2,
1,
`UNIT PLN : ${reportMeta.value.uid.id ? reportMeta.value.uid.name.toUpperCase() + ',' : ''} ${reportMeta.value.up3.id ? reportMeta.value.up3.name.toUpperCase() + ',' : ''} ${reportMeta.value.ulp.id ? reportMeta.value.ulp.name.toUpperCase() + ',' : ''}`
)
setHeaderStyle(
worksheet,
3,
1,
`STATUS : ${reportMeta.value.status ? reportMeta.value.status.name.toUpperCase() : ''}`
)
setHeaderStyle(worksheet, 3, 1, 'Transaksi APKT'.toUpperCase(), true)
setHeaderStyle(
worksheet,
4,
1,
`SLA : ${reportMeta.value.sla ? reportMeta.value.sla.name.toUpperCase() : ''}`
)
setHeaderStyle(worksheet, 5, 1, `PENCARIAN : ${reportMeta.value.keyword.toUpperCase()}`)
setHeaderStyle(worksheet, 7, 1, 'Transaksi APKT'.toUpperCase(), true)
setHeaderStyle(
worksheet,
8,
1,
`PERIODE TANGGAL : ${meta.dateFromFormat} SD TGL ${meta.dateToFormat}`,
true
)
@ -338,15 +330,12 @@ const onExporting = (e: any) => {
worksheet.mergeCells('A2:M2')
worksheet.mergeCells('A3:M3')
worksheet.mergeCells('A4:M4')
worksheet.mergeCells('A5:M5')
worksheet.mergeCells('A7:M7')
worksheet.mergeCells('A8:M8')
exportToExcel({
component: e.component,
worksheet,
autoFilterEnabled: true,
topLeftCell: { row: 10, column: 1 },
topLeftCell: { row: 6, column: 1 },
loadPanel: {
enabled: false
}

View File

@ -4449,6 +4449,7 @@ export const queries = {
$idUid: Int!
$idUp3: Int!
$personilYantek: String!
$userRegu: String!
) {
detailCheckInCheckOutIndividu(
dateFrom: $dateFrom
@ -4457,6 +4458,7 @@ export const queries = {
idUid: $idUid
idUp3: $idUp3
personilYantek: $personilYantek
userRegu: $userRegu
) {
id
id_uid
@ -4512,6 +4514,7 @@ export const queries = {
$idUid: Int!
$idUp3: Int!
$personilYantek: String!
$userRegu: String!
) {
detailCheckInCheckOutKhusus(
dateFrom: $dateFrom
@ -4520,6 +4523,7 @@ export const queries = {
idUid: $idUid
idUp3: $idUp3
personilYantek: $personilYantek
userRegu: $userRegu
) {
id
nama_uid