From 7402e619065c20d48ed8752528416cf1868b2048 Mon Sep 17 00:00:00 2001 From: Viet An Date: Tue, 7 Apr 2026 10:08:00 +0700 Subject: [PATCH] changes --- app/components/TopMenu.vue | 28 +- app/components/debt/Due.vue | 122 ++-- app/components/debt/Overdue.vue | 149 +++-- app/components/maintab/Configuration.vue | 181 ++---- .../modal/PaymentScheduleConfirmModal.vue | 582 +++++++++++++----- app/components/parameter/DeletePayable.vue | 20 +- app/layouts/default.vue | 14 +- app/plugins/02-connection.js | 11 +- app/plugins/03-api-loader.js | 2 +- 9 files changed, 673 insertions(+), 436 deletions(-) diff --git a/app/components/TopMenu.vue b/app/components/TopMenu.vue index c456662..fde8e08 100644 --- a/app/components/TopMenu.vue +++ b/app/components/TopMenu.vue @@ -166,20 +166,20 @@ const menu = [ if ($store.rights.length > 0) { menu = menu.filter((v) => $findIndex($store.rights, { setting: v.id }) >= 0); } -if (menu.length === 0) { - $snackbar( - $store.lang === 'vi' - ? 'Bạn không có quyền truy cập' - : 'You do not have permission to access.', - ); -} -menu.map((v) => { - let arr = $filter($store.common, { category: 'submenu', classify: v.code }); - if ($store.rights.length > 0) { - arr = arr.filter((x) => $findIndex($store.rights, { setting: x.id }) >= 0); - } - v.submenu = arr.length > 0 ? arr : null; -}); +// if (menu.length === 0) { +// $snackbar( +// $store.lang === 'vi' +// ? 'Bạn không có quyền truy cập' +// : 'You do not have permission to access.', +// ); +// } +// menu.map((v) => { +// let arr = $filter($store.common, { category: 'submenu', classify: v.code }); +// if ($store.rights.length > 0) { +// arr = arr.filter((x) => $findIndex($store.rights, { setting: x.id }) >= 0); +// } +// v.submenu = arr.length > 0 ? arr : null; +// }); const leftmenu = $filter(menu, { category: 'topmenu', classify: 'left' }); let currentTab = ref(leftmenu.length > 0 ? leftmenu[0] : undefined); const subTab = ref(); diff --git a/app/components/debt/Due.vue b/app/components/debt/Due.vue index bb2fbf6..72e95c8 100644 --- a/app/components/debt/Due.vue +++ b/app/components/debt/Due.vue @@ -2,24 +2,22 @@ import useSendEmail from '@/components/debt/useSendEmail'; import { isEqual } from 'es-toolkit'; -const { - $dayjs, - $getdata, - $store, -} = useNuxtApp(); +const { $dayjs, $getdata, $store } = useNuxtApp(); const payables = ref(null); const defaultFilter = { status: 1, to_date__gte: $dayjs().format('YYYY-MM-DD'), to_date__lte: undefined, -} +}; const filter = ref(defaultFilter); const activeDateFilter = ref(null); const key = ref(0); function setDateFilter(detail) { - activeDateFilter.value = isEqual(activeDateFilter.value, detail) ? null : detail; + activeDateFilter.value = isEqual(activeDateFilter.value, detail) + ? null + : detail; } function resetDateFilter() { @@ -28,23 +26,27 @@ function resetDateFilter() { const paymentSchedules = ref([]); -onMounted(async () => { - const payablesData = await $getdata('bizsetting', undefined, { filter: { classify: 'duepayables' }, sort: 'index' }); - payables.value = payablesData; -}); +// onMounted(async () => { +// const payablesData = await $getdata('bizsetting', undefined, { filter: { classify: 'duepayables' }, sort: 'index' }); +// payables.value = payablesData; +// }); -watch(activeDateFilter, (val) => { - if (!val) { - filter.value = defaultFilter; - } else { - const cutoffDate = $dayjs().add(val.time, 'day').format('YYYY-MM-DD'); - const filterField = `to_date__${val.lookup}`; - filter.value = { - ...defaultFilter, - [filterField]: cutoffDate, +watch( + activeDateFilter, + (val) => { + if (!val) { + filter.value = defaultFilter; + } else { + const cutoffDate = $dayjs().add(val.time, 'day').format('YYYY-MM-DD'); + const filterField = `to_date__${val.lookup}`; + filter.value = { + ...defaultFilter, + [filterField]: cutoffDate, + }; } - } -}, { deep: true }) + }, + { deep: true }, +); const showmodal = ref(null); @@ -56,40 +58,53 @@ function openConfirmModal() { height: '100px', vbind: { content: `Bạn có đồng ý gửi ${$store.selectedPaymentSchedulesForEmailInDue.length} thông báo đến hạn không?`, - } - } + }, + }; } -watch(filter, () => { - key.value += 1; -}, { deep: true }) +watch( + filter, + () => { + key.value += 1; + }, + { deep: true }, +); watch(key, () => { // reset when DataView re-renders because of filter - $store.commit('selectedPaymentSchedulesForEmailInDue', []) -}) + $store.commit('selectedPaymentSchedulesForEmailInDue', []); +}); function toggleAll() { if ($store.selectedPaymentSchedulesForEmailInDue.length === 0) { - $store.commit('selectedPaymentSchedulesForEmailInDue', paymentSchedules.value.map(p => p.id)) + $store.commit( + 'selectedPaymentSchedulesForEmailInDue', + paymentSchedules.value.map((p) => p.id), + ); } else { - $store.commit('selectedPaymentSchedulesForEmailInDue', []) + $store.commit('selectedPaymentSchedulesForEmailInDue', []); } } const { contents, send, isSending } = useSendEmail(filter, 13); \ No newline at end of file + diff --git a/app/components/debt/Overdue.vue b/app/components/debt/Overdue.vue index b15d7f4..f8e3e19 100644 --- a/app/components/debt/Overdue.vue +++ b/app/components/debt/Overdue.vue @@ -2,23 +2,21 @@ import useSendEmail from '@/components/debt/useSendEmail'; import { isEqual } from 'es-toolkit'; -const { - $dayjs, - $getdata, - $store, -} = useNuxtApp(); +const { $dayjs, $getdata, $store } = useNuxtApp(); const payables = ref(null); const defaultFilter = { status: 1, to_date__lt: $dayjs().format('YYYY-MM-DD'), -} +}; const filter = ref(defaultFilter); const activeDateFilter = ref(null); const key = ref(0); function setDateFilter(detail) { - activeDateFilter.value = isEqual(activeDateFilter.value, detail) ? null : detail; + activeDateFilter.value = isEqual(activeDateFilter.value, detail) + ? null + : detail; } function resetDateFilter() { @@ -26,40 +24,42 @@ function resetDateFilter() { } const paymentSchedule = ref([]); -const paymentScheduleValues = 'id,penalty_paid,penalty_remain,penalty_amount,penalty_reduce,batch_date,amount_remain,paid_amount,remain_amount,code,status,txn_detail,txn_detail__transaction__product,txn_detail__transaction__product__trade_code,txn_detail__transaction__code,txn_detail__code,txn_detail__transaction__customer__code,txn_detail__transaction__customer__fullname,txn_detail__transaction__customer__email,txn_detail__transaction__customer__type__code,txn_detail__transaction__customer__legal_code,txn_detail__transaction__customer__contact_address,txn_detail__transaction__customer__address,txn_detail__transaction__customer__phone,txn_detail__transaction__policy__code,txn_detail__phase__name,type__name,from_date,to_date,amount,cycle,cycle_days,status__name,detail,entry'; +const paymentScheduleValues = + 'id,penalty_paid,penalty_remain,penalty_amount,penalty_reduce,batch_date,amount_remain,paid_amount,remain_amount,code,status,txn_detail,txn_detail__transaction__product,txn_detail__transaction__product__trade_code,txn_detail__transaction__code,txn_detail__code,txn_detail__transaction__customer__code,txn_detail__transaction__customer__fullname,txn_detail__transaction__customer__email,txn_detail__transaction__customer__type__code,txn_detail__transaction__customer__legal_code,txn_detail__transaction__customer__contact_address,txn_detail__transaction__customer__address,txn_detail__transaction__customer__phone,txn_detail__transaction__policy__code,txn_detail__phase__name,type__name,from_date,to_date,amount,cycle,cycle_days,status__name,detail,entry'; async function setPaymentSheduleData() { - const paymentScheduleData = await $getdata( - 'payment_schedule', - undefined, - { - filter: filter.value, - sort: 'to_date', - values: paymentScheduleValues, - } - ); + const paymentScheduleData = await $getdata('payment_schedule', undefined, { + filter: filter.value, + sort: 'to_date', + values: paymentScheduleValues, + }); paymentSchedule.value = paymentScheduleData; } -onMounted(async () => { - setPaymentSheduleData(); - const payablesData = await $getdata('bizsetting', undefined, { filter: { classify: 'overduepayables' }, sort: 'index' }); - payables.value = payablesData; -}); +// onMounted(async () => { +// setPaymentSheduleData(); +// const payablesData = await $getdata('bizsetting', undefined, { filter: { classify: 'overduepayables' }, sort: 'index' }); +// payables.value = payablesData; +// }); -watch(activeDateFilter, (val) => { - if (!val) { - filter.value = defaultFilter; - } else { - const cutoffDate = $dayjs().subtract(val.time, 'day').format('YYYY-MM-DD'); - const filterField = `to_date__${val.lookup === 'lte' ? 'gt' : - 'lte'}`; - filter.value = { - ...defaultFilter, - [filterField]: cutoffDate, +watch( + activeDateFilter, + (val) => { + if (!val) { + filter.value = defaultFilter; + } else { + const cutoffDate = $dayjs() + .subtract(val.time, 'day') + .format('YYYY-MM-DD'); + const filterField = `to_date__${val.lookup === 'lte' ? 'gt' : 'lte'}`; + filter.value = { + ...defaultFilter, + [filterField]: cutoffDate, + }; } - } -}, { deep: true }) + }, + { deep: true }, +); const showmodal = ref(null); @@ -71,42 +71,55 @@ function openConfirmModal() { height: '100px', vbind: { content: `Bạn có đồng ý gửi ${$store.selectedPaymentSchedulesForEmailInOverdue.length} thông báo quá hạn không?`, - } - } + }, + }; } -watch(filter, () => { - key.value += 1; - setPaymentSheduleData(); -}, { deep: true }) +watch( + filter, + () => { + key.value += 1; + setPaymentSheduleData(); + }, + { deep: true }, +); watch(key, () => { // reset when DataView re-renders because of filter - $store.commit('selectedPaymentSchedulesForEmailInOverdue', []) -}) + $store.commit('selectedPaymentSchedulesForEmailInOverdue', []); +}); function toggleAll() { if ($store.selectedPaymentSchedulesForEmailInOverdue.length === 0) { - $store.commit('selectedPaymentSchedulesForEmailInOverdue', paymentSchedule.value.map(p => p.id)) + $store.commit( + 'selectedPaymentSchedulesForEmailInOverdue', + paymentSchedule.value.map((p) => p.id), + ); } else { - $store.commit('selectedPaymentSchedulesForEmailInOverdue', []) + $store.commit('selectedPaymentSchedulesForEmailInOverdue', []); } } const { contents, send, isSending } = useSendEmail(filter, 14); \ No newline at end of file + diff --git a/app/components/maintab/Configuration.vue b/app/components/maintab/Configuration.vue index 89e9859..20c06a9 100644 --- a/app/components/maintab/Configuration.vue +++ b/app/components/maintab/Configuration.vue @@ -4,7 +4,11 @@
{{ v.name }} @@ -13,162 +17,105 @@
{{ current.name }}
- - + +
\ No newline at end of file + diff --git a/app/components/parameter/DeletePayable.vue b/app/components/parameter/DeletePayable.vue index 9969309..54fbb8f 100644 --- a/app/components/parameter/DeletePayable.vue +++ b/app/components/parameter/DeletePayable.vue @@ -3,13 +3,15 @@

- Bạn có chắc chắn muốn xóa lịch công nợ thời gian: {{ detail.time }} ngày - mẫu: [{{ - detail.name?.toUpperCase() - }}] không? + Bạn có chắc chắn muốn xóa lịch công nợ thời gian: + {{ detail.time }} ngày - mẫu: [{{ detail.name?.toUpperCase() }}] + không?

- +
@@ -19,7 +21,7 @@ diff --git a/app/layouts/default.vue b/app/layouts/default.vue index 10bcda4..085b310 100644 --- a/app/layouts/default.vue +++ b/app/layouts/default.vue @@ -4,7 +4,6 @@ class="has-background-white" data-theme="light" lang="vi" - v-if="authorized" > @@ -24,7 +23,7 @@ import { useRoute } from 'vue-router'; import SnackBar from '@/components/snackbar/SnackBar.vue'; import Modal from '@/components/Modal.vue'; const route = useRoute(); -const { $getdata, $requestLogin, $store } = useNuxtApp(); +const { $getdata, $store } = useNuxtApp(); var authorized = ref(false); const snackbar = ref(undefined); const showmodal = ref(undefined); @@ -46,6 +45,7 @@ function getViewport() { $store.commit('viewport', viewport); } async function checkRedirect() { + console.log('checkRedirect'); if (route.query.username && route.query.token) { let row = await $getdata( 'user', @@ -57,12 +57,14 @@ async function checkRedirect() { }, true, ); - if (row === 'error' || row === undefined) $requestLogin(); + if (row === 'error' || row === undefined) return; else { row.token = route.query.token; $store.commit('login', row); } - } else if (!$store.login) return $requestLogin(); + } else if (!$store.login) { + return; + } await checkLogin(); } async function checkLogin() { @@ -89,9 +91,9 @@ async function checkLogin() { undefined, true, ); - if (authtoken ? authtoken.expiry : true) return $requestLogin(); + if (authtoken ? authtoken.expiry : true) return; authorized.value = true; - } else $requestLogin(); + } } onMounted(() => { checkRedirect(); diff --git a/app/plugins/02-connection.js b/app/plugins/02-connection.js index a89364d..19f93bd 100644 --- a/app/plugins/02-connection.js +++ b/app/plugins/02-connection.js @@ -603,13 +603,6 @@ export default defineNuxtPlugin(() => { url_detail: "data-detail/Menu_Choice/", params: {}, }, - { - name: "moneyunit", - commit: "moneyunit", - url: "data/Money_Unit/", - url_detail: "data-detail/Money_Unit/", - params: {}, - }, { name: "legaltype", commit: "legaltype", @@ -847,6 +840,7 @@ export default defineNuxtPlugin(() => { store.commit("login", undefined); store.commit("layersetting", undefined); store.commit("lastlegendfiltertab", "Giỏ hàng"); + console.log('requestLogin: redirect to login') window.location.href = `https://${mode === "dev" ? "dev." : ""}login.utopia.com.vn/signin?module=${module}&link=${window.location.origin}`; }; @@ -876,6 +870,7 @@ export default defineNuxtPlugin(() => { // get data const getapi = async function (list) { + console.trace('getapi') try { let arr = list.map((v) => { let found = apis.find((api) => api.name === v.name); @@ -898,7 +893,7 @@ export default defineNuxtPlugin(() => { }); return list; } catch (err) { - console.log(err); + console.error(err); return "error"; } }; diff --git a/app/plugins/03-api-loader.js b/app/plugins/03-api-loader.js index 1138b08..a96c9c5 100644 --- a/app/plugins/03-api-loader.js +++ b/app/plugins/03-api-loader.js @@ -2,7 +2,7 @@ export default defineNuxtPlugin(async (nuxtApp) => { const { $getapi, $readyapi } = useNuxtApp() let connlist = $readyapi(['moneyunit', 'datatype', 'filterchoice', 'colorchoice', 'textalign', 'placement', 'colorscheme', 'filtertype', 'sorttype', 'tablesetting', 'settingchoice', 'sharechoice', 'menuchoice', 'settingtype', 'settingclass', - 'common', 'sex', 'legaltype', 'cart']) +'sex', 'legaltype', 'cart']) let filter = connlist.filter(v=>!v.ready) if(filter.length>0) await $getapi(filter) })