diff --git a/src/components/common/VnSelect.vue b/src/components/common/VnSelect.vue index 63a3f088f..b6dc226cc 100644 --- a/src/components/common/VnSelect.vue +++ b/src/components/common/VnSelect.vue @@ -73,6 +73,10 @@ const $props = defineProps({ type: Boolean, default: true, }, + params: { + type: Object, + default: null, + }, }); const { t } = useI18n(); @@ -153,9 +157,14 @@ async function fetchFilter(val) { ? optionValue.value : optionFilter.value ?? optionLabel.value); - const defaultWhere = $props.useLike - ? { [key]: { like: `%${val}%` } } - : { [key]: val }; + let defaultWhere = {}; + if ($props.filterOptions.length) { + defaultWhere = $props.filterOptions.reduce((obj, prop) => { + if (!obj.or) obj.or = []; + obj.or.push({ [prop]: getVal(val) }); + return obj; + }, {}); + } else defaultWhere = { [key]: getVal(val) }; const where = { ...(val ? defaultWhere : {}), ...$props.where }; const fetchOptions = { where, include, limit }; if (fields) fetchOptions.fields = fields; @@ -194,6 +203,8 @@ async function filterHandler(val, update) { function nullishToTrue(value) { return value ?? true; } + +const getVal = (val) => ($props.useLike ? { like: `%${val}%` } : val); </script> <template> @@ -205,6 +216,7 @@ function nullishToTrue(value) { :limit="limit" :sort-by="sortBy" :fields="fields" + :params="params" /> <QSelect v-model="value" diff --git a/src/pages/Worker/WorkerCreate.vue b/src/pages/Worker/WorkerCreate.vue index 23f92bef1..297aa4182 100644 --- a/src/pages/Worker/WorkerCreate.vue +++ b/src/pages/Worker/WorkerCreate.vue @@ -19,7 +19,6 @@ const { t } = useI18n(); const user = useState().getUser(); const companiesOptions = ref([]); -const workersOptions = ref([]); const payMethodsOptions = ref([]); const bankEntitiesOptions = ref([]); const formData = ref({ companyFk: user.value.companyFk, isFreelance: false }); @@ -56,6 +55,18 @@ function generateCodeUser(worker) { if (!worker.companyFk) worker.companyFk = user.companyFk; } + +async function autofillBic(worker) { + if (!worker || !worker.iban) return; + + let bankEntityId = parseInt(worker.iban.substr(4, 4)); + let filter = { where: { id: bankEntityId } }; + + const { data } = await axios.get(`BankEntities`, { params: { filter } }); + const hasData = data && data[0]; + if (hasData) worker.bankEntityFk = data[0].id; + else if (!hasData) worker.bankEntityFk = undefined; +} </script> <template> <FetchData @@ -63,11 +74,6 @@ function generateCodeUser(worker) { @on-fetch="(data) => (companiesOptions = data)" auto-load /> - <FetchData - url="Workers/search" - @on-fetch="(data) => (workersOptions = data)" - auto-load - /> <FetchData url="Paymethods" @on-fetch="(data) => (payMethodsOptions = data)" @@ -146,7 +152,7 @@ function generateCodeUser(worker) { <VnSelect :label="t('worker.create.boss')" v-model="data.bossFk" - :options="workersOptions" + url="Workers/search" option-value="id" option-label="name" hide-selected @@ -220,6 +226,7 @@ function generateCodeUser(worker) { :label="t('worker.create.iban')" :rules="validate('Worker.iban')" :disable="formData.isFreelance" + @update:model-value="autofillBic(data)" > <template #append> <QIcon name="info" class="cursor-info"> @@ -237,6 +244,8 @@ function generateCodeUser(worker) { :roles-allowed-to-create="['salesAssistant', 'hr']" :rules="validate('Worker.bankEntity')" :disable="formData.isFreelance" + @update:model-value="autofillBic(data)" + :filter-options="['bic', 'name']" > <template #form> <CreateBankEntityForm diff --git a/src/pages/Worker/WorkerList.vue b/src/pages/Worker/WorkerList.vue index a10bdd040..0ea094e23 100644 --- a/src/pages/Worker/WorkerList.vue +++ b/src/pages/Worker/WorkerList.vue @@ -23,7 +23,6 @@ const { t } = useI18n(); const tableRef = ref(); const { viewSummary } = useSummaryDialog(); const companiesOptions = ref([]); -const workersOptions = ref([]); const payMethodsOptions = ref([]); const bankEntitiesOptions = ref([]); const postcodesOptions = ref([]); @@ -125,6 +124,16 @@ function generateCodeUser(worker) { if (!worker.companyFk) worker.companyFk = user.companyFk; } + +async function autofillBic(worker) { + if (!worker || !worker.iban) return; + + let bankEntityId = parseInt(worker.iban.substr(4, 4)); + let filter = { where: { id: bankEntityId } }; + + const { data } = await axios.get(`BankEntities`, { params: { filter } }); + worker.bankEntityFk = data?.[0]?.id ?? undefined; +} </script> <template> <VnSearchbar @@ -137,11 +146,6 @@ function generateCodeUser(worker) { @on-fetch="(data) => (companiesOptions = data)" auto-load /> - <FetchData - url="Workers/search" - @on-fetch="(data) => (workersOptions = data)" - auto-load - /> <FetchData url="Paymethods" @on-fetch="(data) => (payMethodsOptions = data)" @@ -225,7 +229,7 @@ function generateCodeUser(worker) { <VnSelect :label="t('worker.create.boss')" v-model="data.bossFk" - :options="workersOptions" + url="Workers/search" option-value="id" option-label="name" hide-selected @@ -290,6 +294,7 @@ function generateCodeUser(worker) { v-model="data.iban" :label="t('worker.create.iban')" :disable="data.isFreelance" + @update:model-value="autofillBic(data)" > <template #append> <QIcon name="info" class="cursor-info"> @@ -308,6 +313,8 @@ function generateCodeUser(worker) { hide-selected :roles-allowed-to-create="['salesAssistant', 'hr']" :disable="data.isFreelance" + @update:model-value="autofillBic(data)" + :filter-options="['bic', 'name']" > <template #form> <CreateBankEntityForm