forked from verdnatura/salix-front
Se crea tabla y filtros de morosos en clientes
This commit is contained in:
parent
5e1e49e253
commit
5729204a3b
|
@ -113,6 +113,7 @@ export default {
|
||||||
webPayments: 'Web Payments',
|
webPayments: 'Web Payments',
|
||||||
extendedList: 'Extended list',
|
extendedList: 'Extended list',
|
||||||
notifications: 'Notifications',
|
notifications: 'Notifications',
|
||||||
|
defaulter: 'Defaulter',
|
||||||
createCustomer: 'Create customer',
|
createCustomer: 'Create customer',
|
||||||
summary: 'Summary',
|
summary: 'Summary',
|
||||||
basicData: 'Basic Data',
|
basicData: 'Basic Data',
|
||||||
|
@ -568,7 +569,7 @@ export default {
|
||||||
landed: 'Landed',
|
landed: 'Landed',
|
||||||
hour: 'Hour',
|
hour: 'Hour',
|
||||||
agency: 'Agency',
|
agency: 'Agency',
|
||||||
total: 'Total'
|
total: 'Total',
|
||||||
},
|
},
|
||||||
form: {
|
form: {
|
||||||
clientFk: 'Client',
|
clientFk: 'Client',
|
||||||
|
@ -577,7 +578,7 @@ export default {
|
||||||
agencyModeFk: 'Agency',
|
agencyModeFk: 'Agency',
|
||||||
},
|
},
|
||||||
list: {
|
list: {
|
||||||
newOrder: 'New Order'
|
newOrder: 'New Order',
|
||||||
},
|
},
|
||||||
summary: {
|
summary: {
|
||||||
basket: 'Basket',
|
basket: 'Basket',
|
||||||
|
@ -603,8 +604,8 @@ export default {
|
||||||
description: 'Description',
|
description: 'Description',
|
||||||
quantity: 'Quantity',
|
quantity: 'Quantity',
|
||||||
price: 'Price',
|
price: 'Price',
|
||||||
amount: 'Amount'
|
amount: 'Amount',
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
worker: {
|
worker: {
|
||||||
pageTitles: {
|
pageTitles: {
|
||||||
|
|
|
@ -113,6 +113,7 @@ export default {
|
||||||
webPayments: 'Pagos Web',
|
webPayments: 'Pagos Web',
|
||||||
extendedList: 'Listado extendido',
|
extendedList: 'Listado extendido',
|
||||||
notifications: 'Notificaciones',
|
notifications: 'Notificaciones',
|
||||||
|
defaulter: 'Morosos',
|
||||||
createCustomer: 'Crear cliente',
|
createCustomer: 'Crear cliente',
|
||||||
basicData: 'Datos básicos',
|
basicData: 'Datos básicos',
|
||||||
summary: 'Resumen',
|
summary: 'Resumen',
|
||||||
|
@ -477,7 +478,7 @@ export default {
|
||||||
landed: 'F. entrega',
|
landed: 'F. entrega',
|
||||||
hour: 'Hora',
|
hour: 'Hora',
|
||||||
agency: 'Agencia',
|
agency: 'Agencia',
|
||||||
total: 'Total'
|
total: 'Total',
|
||||||
},
|
},
|
||||||
form: {
|
form: {
|
||||||
clientFk: 'Cliente',
|
clientFk: 'Cliente',
|
||||||
|
@ -486,7 +487,7 @@ export default {
|
||||||
agencyModeFk: 'Agencia',
|
agencyModeFk: 'Agencia',
|
||||||
},
|
},
|
||||||
list: {
|
list: {
|
||||||
newOrder: 'Nuevo Pedido'
|
newOrder: 'Nuevo Pedido',
|
||||||
},
|
},
|
||||||
summary: {
|
summary: {
|
||||||
basket: 'Cesta',
|
basket: 'Cesta',
|
||||||
|
@ -512,8 +513,8 @@ export default {
|
||||||
description: 'Descripción',
|
description: 'Descripción',
|
||||||
quantity: 'Cantidad',
|
quantity: 'Cantidad',
|
||||||
price: 'Precio',
|
price: 'Precio',
|
||||||
amount: 'Monto'
|
amount: 'Monto',
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
shelving: {
|
shelving: {
|
||||||
pageTitles: {
|
pageTitles: {
|
||||||
|
|
|
@ -0,0 +1,253 @@
|
||||||
|
<script setup>
|
||||||
|
import { ref, computed, onBeforeMount } from 'vue';
|
||||||
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
|
import { QBtn, QCheckbox } from 'quasar';
|
||||||
|
|
||||||
|
import { useArrayData } from 'composables/useArrayData';
|
||||||
|
import { useStateStore } from 'stores/useStateStore';
|
||||||
|
|
||||||
|
import { toCurrency, toDate } from 'filters/index';
|
||||||
|
import CustomerNotificationsFilter from './CustomerDefaulterFilter.vue';
|
||||||
|
import CustomerDescriptorProxy from 'src/pages/Customer/Card/CustomerDescriptorProxy.vue';
|
||||||
|
import WorkerDescriptorProxy from 'src/pages/Worker/Card/WorkerDescriptorProxy.vue';
|
||||||
|
|
||||||
|
const { t } = useI18n();
|
||||||
|
const stateStore = useStateStore();
|
||||||
|
|
||||||
|
const arrayData = ref(null);
|
||||||
|
|
||||||
|
onBeforeMount(async () => {
|
||||||
|
arrayData.value = useArrayData('CustomerDefaulter', {
|
||||||
|
url: 'Defaulters/filter',
|
||||||
|
limit: 0,
|
||||||
|
});
|
||||||
|
await arrayData.value.fetch({ append: false });
|
||||||
|
stateStore.rightDrawer = true;
|
||||||
|
});
|
||||||
|
|
||||||
|
const rows = computed(() => arrayData.value.store.data);
|
||||||
|
|
||||||
|
const selected = ref([]);
|
||||||
|
const worderId = ref(0);
|
||||||
|
const customerId = ref(0);
|
||||||
|
|
||||||
|
const tableColumnComponents = {
|
||||||
|
client: {
|
||||||
|
component: QBtn,
|
||||||
|
props: () => ({ flat: true, color: 'blue' }),
|
||||||
|
event: (prop) => selectClientId(prop.row.clientFk),
|
||||||
|
},
|
||||||
|
isWorker: {
|
||||||
|
component: QCheckbox,
|
||||||
|
props: (prop) => ({
|
||||||
|
disable: true,
|
||||||
|
'model-value': Boolean(prop.value),
|
||||||
|
}),
|
||||||
|
event: () => {},
|
||||||
|
},
|
||||||
|
salesperson: {
|
||||||
|
component: QBtn,
|
||||||
|
props: () => ({ flat: true, color: 'blue' }),
|
||||||
|
event: (prop) => selectSalespersonId(prop.row.salesPersonFk),
|
||||||
|
},
|
||||||
|
country: {
|
||||||
|
component: 'span',
|
||||||
|
props: () => {},
|
||||||
|
event: () => {},
|
||||||
|
},
|
||||||
|
paymentMethod: {
|
||||||
|
component: 'span',
|
||||||
|
props: () => {},
|
||||||
|
event: () => {},
|
||||||
|
},
|
||||||
|
balance: {
|
||||||
|
component: 'span',
|
||||||
|
props: () => {},
|
||||||
|
event: () => {},
|
||||||
|
},
|
||||||
|
author: {
|
||||||
|
component: QBtn,
|
||||||
|
props: () => ({ flat: true, color: 'blue' }),
|
||||||
|
event: (prop) => selectAuthorId(prop.row.workerFk),
|
||||||
|
},
|
||||||
|
lastObservation: {
|
||||||
|
component: 'span',
|
||||||
|
props: () => {},
|
||||||
|
event: () => {},
|
||||||
|
},
|
||||||
|
date: {
|
||||||
|
component: 'span',
|
||||||
|
props: () => {},
|
||||||
|
event: () => {},
|
||||||
|
},
|
||||||
|
credit: {
|
||||||
|
component: 'span',
|
||||||
|
props: () => {},
|
||||||
|
event: () => {},
|
||||||
|
},
|
||||||
|
from: {
|
||||||
|
component: 'span',
|
||||||
|
props: () => {},
|
||||||
|
event: () => {},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const columns = computed(() => {
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
align: 'left',
|
||||||
|
field: 'clientName',
|
||||||
|
label: t('Client'),
|
||||||
|
name: 'client',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
align: 'left',
|
||||||
|
field: 'isWorker',
|
||||||
|
label: t('Is worker'),
|
||||||
|
name: 'isWorker',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
align: 'left',
|
||||||
|
field: 'salesPersonName',
|
||||||
|
label: t('Salesperson'),
|
||||||
|
name: 'salesperson',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
align: 'left',
|
||||||
|
field: 'country',
|
||||||
|
label: t('Country'),
|
||||||
|
name: 'country',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
align: 'left',
|
||||||
|
field: 'payMethod',
|
||||||
|
label: t('P. Method'),
|
||||||
|
name: 'paymentMethod',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
align: 'left',
|
||||||
|
field: (row) => toCurrency(row.amount),
|
||||||
|
label: t('Balance D.'),
|
||||||
|
name: 'balance',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
align: 'left',
|
||||||
|
field: 'workerName',
|
||||||
|
label: t('Author'),
|
||||||
|
name: 'author',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
align: 'left',
|
||||||
|
field: 'observation',
|
||||||
|
label: t('Last observation'),
|
||||||
|
name: 'lastObservation',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
align: 'left',
|
||||||
|
field: (row) => toDate(row.created),
|
||||||
|
label: t('L. O. Date'),
|
||||||
|
name: 'date',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
align: 'left',
|
||||||
|
field: (row) => toCurrency(row.creditInsurance),
|
||||||
|
label: t('Credit I.'),
|
||||||
|
name: 'credit',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
align: 'left',
|
||||||
|
field: (row) => toDate(row.defaulterSinced),
|
||||||
|
label: t('From'),
|
||||||
|
name: 'from',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
});
|
||||||
|
|
||||||
|
const selectClientId = (id) => {
|
||||||
|
worderId.value = 0;
|
||||||
|
customerId.value = id;
|
||||||
|
};
|
||||||
|
|
||||||
|
const selectSalespersonId = (id) => {
|
||||||
|
customerId.value = 0;
|
||||||
|
worderId.value = id;
|
||||||
|
};
|
||||||
|
|
||||||
|
const selectAuthorId = (id) => {
|
||||||
|
customerId.value = 0;
|
||||||
|
worderId.value = id;
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<QDrawer v-model="stateStore.rightDrawer" side="right" :width="256" show-if-above>
|
||||||
|
<QScrollArea class="fit text-grey-8">
|
||||||
|
<CustomerNotificationsFilter data-key="CustomerDefaulter" />
|
||||||
|
</QScrollArea>
|
||||||
|
</QDrawer>
|
||||||
|
|
||||||
|
<QToolbar class="bg-vn-dark">
|
||||||
|
<div id="st-data"></div>
|
||||||
|
<QSpace />
|
||||||
|
<div id="st-actions"></div>
|
||||||
|
</QToolbar>
|
||||||
|
|
||||||
|
<QPage class="column items-center q-pa-md">
|
||||||
|
<QTable
|
||||||
|
:columns="columns"
|
||||||
|
:pagination="{ rowsPerPage: 0 }"
|
||||||
|
:rows="rows"
|
||||||
|
class="full-width q-mt-md"
|
||||||
|
hide-bottom
|
||||||
|
row-key="id"
|
||||||
|
selection="multiple"
|
||||||
|
v-model:selected="selected"
|
||||||
|
>
|
||||||
|
<template #top>
|
||||||
|
<div v-if="rows" class="full-width flex justify-end">
|
||||||
|
{{ `${rows.length} ${t('route.cmr.list.results')}` }}
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<template #body-cell="props">
|
||||||
|
<QTd :props="props">
|
||||||
|
<QTr :props="props" class="cursor-pointer">
|
||||||
|
<component
|
||||||
|
:is="tableColumnComponents[props.col.name].component"
|
||||||
|
class="col-content"
|
||||||
|
v-bind="tableColumnComponents[props.col.name].props(props)"
|
||||||
|
@click="tableColumnComponents[props.col.name].event(props)"
|
||||||
|
>
|
||||||
|
{{ props.value }}
|
||||||
|
|
||||||
|
<WorkerDescriptorProxy v-if="worderId" :id="worderId" />
|
||||||
|
<CustomerDescriptorProxy v-else :id="customerId" />
|
||||||
|
</component>
|
||||||
|
</QTr>
|
||||||
|
</QTd>
|
||||||
|
</template>
|
||||||
|
</QTable>
|
||||||
|
</QPage>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.col-content {
|
||||||
|
border-radius: 4px;
|
||||||
|
padding: 6px 6px 6px 6px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<i18n>
|
||||||
|
es:
|
||||||
|
Client: Cliente
|
||||||
|
Is worker: Es trabajador
|
||||||
|
Salesperson: Comercial
|
||||||
|
Country: País
|
||||||
|
P. Method: F. Pago
|
||||||
|
Balance D.: Saldo V.
|
||||||
|
Author: Autor
|
||||||
|
Last observation: Última observación
|
||||||
|
L. O. Date: Fecha Ú. O.
|
||||||
|
Credit I.: Crédito A.
|
||||||
|
From: Desde
|
||||||
|
</i18n>
|
|
@ -0,0 +1,238 @@
|
||||||
|
<script setup>
|
||||||
|
import { ref } from 'vue';
|
||||||
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
|
import FetchData from 'components/FetchData.vue';
|
||||||
|
import VnFilterPanel from 'src/components/ui/VnFilterPanel.vue';
|
||||||
|
import VnInput from 'src/components/common/VnInput.vue';
|
||||||
|
import VnInputDate from 'src/components/common/VnInputDate.vue';
|
||||||
|
import VnSelectFilter from 'components/common/VnSelectFilter.vue';
|
||||||
|
|
||||||
|
const { t } = useI18n();
|
||||||
|
const props = defineProps({
|
||||||
|
dataKey: {
|
||||||
|
type: String,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const clients = ref();
|
||||||
|
const salespersons = ref();
|
||||||
|
const countries = ref();
|
||||||
|
const authors = ref();
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<FetchData @on-fetch="(data) => (clients = data)" auto-load url="Clients" />
|
||||||
|
<FetchData
|
||||||
|
:filter="{ where: { role: 'salesPerson' } }"
|
||||||
|
@on-fetch="(data) => (salespersons = data)"
|
||||||
|
auto-load
|
||||||
|
url="Workers/activeWithInheritedRole"
|
||||||
|
/>
|
||||||
|
<FetchData @on-fetch="(data) => (countries = data)" auto-load url="Countries" />
|
||||||
|
<FetchData
|
||||||
|
@on-fetch="(data) => (authors = data)"
|
||||||
|
auto-load
|
||||||
|
url="Workers/activeWithInheritedRole"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<VnFilterPanel :data-key="props.dataKey" :search-button="true">
|
||||||
|
<template #tags="{ tag, formatFn }">
|
||||||
|
<div class="q-gutter-x-xs">
|
||||||
|
<strong>{{ t(`params.${tag.label}`) }}: </strong>
|
||||||
|
<span>{{ formatFn(tag.value) }}</span>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<template #body="{ params }">
|
||||||
|
<QList dense class="list">
|
||||||
|
<QItem class="q-mb-sm q-mt-sm">
|
||||||
|
<QItemSection v-if="clients">
|
||||||
|
<VnSelectFilter
|
||||||
|
:input-debounce="0"
|
||||||
|
:label="t('Client')"
|
||||||
|
:options="clients"
|
||||||
|
dense
|
||||||
|
emit-value
|
||||||
|
hide-selected
|
||||||
|
map-options
|
||||||
|
option-label="name"
|
||||||
|
option-value="clientTypeFk"
|
||||||
|
outlined
|
||||||
|
rounded
|
||||||
|
use-input
|
||||||
|
v-model="params.clientFk"
|
||||||
|
/>
|
||||||
|
</QItemSection>
|
||||||
|
<QItemSection v-else>
|
||||||
|
<QSkeleton class="full-width" type="QInput" />
|
||||||
|
</QItemSection>
|
||||||
|
</QItem>
|
||||||
|
|
||||||
|
<QItem class="q-mb-sm">
|
||||||
|
<QItemSection v-if="salespersons">
|
||||||
|
<VnSelectFilter
|
||||||
|
:input-debounce="0"
|
||||||
|
:label="t('Salesperson')"
|
||||||
|
:options="salespersons"
|
||||||
|
dense
|
||||||
|
emit-value
|
||||||
|
hide-selected
|
||||||
|
map-options
|
||||||
|
option-label="name"
|
||||||
|
option-value="id"
|
||||||
|
outlined
|
||||||
|
rounded
|
||||||
|
use-input
|
||||||
|
v-model="params.salesPersonFk"
|
||||||
|
/>
|
||||||
|
</QItemSection>
|
||||||
|
<QItemSection v-else>
|
||||||
|
<QSkeleton class="full-width" type="QInput" />
|
||||||
|
</QItemSection>
|
||||||
|
</QItem>
|
||||||
|
|
||||||
|
<QItem class="q-mb-sm">
|
||||||
|
<QItemSection v-if="countries">
|
||||||
|
<VnSelectFilter
|
||||||
|
:input-debounce="0"
|
||||||
|
:label="t('Country')"
|
||||||
|
:options="countries"
|
||||||
|
dense
|
||||||
|
emit-value
|
||||||
|
hide-selected
|
||||||
|
map-options
|
||||||
|
option-label="country"
|
||||||
|
option-value="id"
|
||||||
|
outlined
|
||||||
|
rounded
|
||||||
|
use-input
|
||||||
|
v-model="params.countryFk"
|
||||||
|
/>
|
||||||
|
</QItemSection>
|
||||||
|
<QItemSection v-else>
|
||||||
|
<QSkeleton class="full-width" type="QInput" />
|
||||||
|
</QItemSection>
|
||||||
|
</QItem>
|
||||||
|
|
||||||
|
<QItem class="q-mb-sm">
|
||||||
|
<QItemSection>
|
||||||
|
<VnInput
|
||||||
|
:label="t('P. Method')"
|
||||||
|
is-outlined
|
||||||
|
v-model="params.paymentMethod"
|
||||||
|
/>
|
||||||
|
</QItemSection>
|
||||||
|
</QItem>
|
||||||
|
|
||||||
|
<QItem class="q-mb-sm">
|
||||||
|
<QItemSection>
|
||||||
|
<VnInput
|
||||||
|
:label="t('Balance D.')"
|
||||||
|
is-outlined
|
||||||
|
v-model="params.balance"
|
||||||
|
/>
|
||||||
|
</QItemSection>
|
||||||
|
</QItem>
|
||||||
|
|
||||||
|
<QItem class="q-mb-sm">
|
||||||
|
<QItemSection v-if="authors">
|
||||||
|
<VnSelectFilter
|
||||||
|
:input-debounce="0"
|
||||||
|
:label="t('Author')"
|
||||||
|
:options="authors"
|
||||||
|
dense
|
||||||
|
emit-value
|
||||||
|
hide-selected
|
||||||
|
map-options
|
||||||
|
option-label="name"
|
||||||
|
option-value="id"
|
||||||
|
outlined
|
||||||
|
rounded
|
||||||
|
use-input
|
||||||
|
v-model="params.workerFk"
|
||||||
|
/>
|
||||||
|
</QItemSection>
|
||||||
|
<QItemSection v-else>
|
||||||
|
<QSkeleton class="full-width" type="QInput" />
|
||||||
|
</QItemSection>
|
||||||
|
</QItem>
|
||||||
|
|
||||||
|
<QItem class="q-mb-sm">
|
||||||
|
<QItemSection>
|
||||||
|
<VnInput
|
||||||
|
:label="t('L. O. Date')"
|
||||||
|
is-outlined
|
||||||
|
v-model="params.date"
|
||||||
|
/>
|
||||||
|
</QItemSection>
|
||||||
|
</QItem>
|
||||||
|
|
||||||
|
<QItem class="q-mb-sm">
|
||||||
|
<QItemSection>
|
||||||
|
<VnInput
|
||||||
|
:label="t('Credit I.')"
|
||||||
|
is-outlined
|
||||||
|
v-model="params.credit"
|
||||||
|
/>
|
||||||
|
</QItemSection>
|
||||||
|
</QItem>
|
||||||
|
|
||||||
|
<QItem class="q-mb-sm">
|
||||||
|
<QItemSection>
|
||||||
|
<VnInputDate
|
||||||
|
:label="t('From')"
|
||||||
|
is-outlined
|
||||||
|
v-model="params.defaulterSinced"
|
||||||
|
/>
|
||||||
|
</QItemSection>
|
||||||
|
</QItem>
|
||||||
|
<QSeparator />
|
||||||
|
</QList>
|
||||||
|
</template>
|
||||||
|
</VnFilterPanel>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.list {
|
||||||
|
width: 256px;
|
||||||
|
}
|
||||||
|
.list * {
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<i18n>
|
||||||
|
en:
|
||||||
|
params:
|
||||||
|
clientFk: Client
|
||||||
|
salesPersonFk: Salesperson
|
||||||
|
countryFk: Country
|
||||||
|
paymentMethod: P. Method
|
||||||
|
balance: Balance D.
|
||||||
|
workerFk: Author
|
||||||
|
date: L. O. Date
|
||||||
|
credit: Credit I.
|
||||||
|
defaulterSinced: From
|
||||||
|
es:
|
||||||
|
params:
|
||||||
|
clientFk: Cliente
|
||||||
|
salesPersonFk: Comercial
|
||||||
|
countryFk: País
|
||||||
|
paymentMethod: F. Pago
|
||||||
|
balance: Saldo V.
|
||||||
|
workerFk: Autor
|
||||||
|
date: Fecha Ú. O.
|
||||||
|
credit: Crédito A.
|
||||||
|
defaulterSinced: Desde
|
||||||
|
Client: Cliente
|
||||||
|
Salesperson: Comercial
|
||||||
|
Country: País
|
||||||
|
P. Method: F. Pago
|
||||||
|
Balance D.: Saldo V.
|
||||||
|
Author: Autor
|
||||||
|
L. O. Date: Fecha Ú. O.
|
||||||
|
Credit I.: Crédito A.
|
||||||
|
From: Desde
|
||||||
|
</i18n>
|
|
@ -4,7 +4,7 @@ import { useRouter } from 'vue-router';
|
||||||
|
|
||||||
import { useQuasar } from 'quasar';
|
import { useQuasar } from 'quasar';
|
||||||
|
|
||||||
import CustomerSummaryDialog from './Card/CustomerSummaryDialog.vue';
|
import CustomerSummaryDialog from '../Card/CustomerSummaryDialog.vue';
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
const quasar = useQuasar();
|
const quasar = useQuasar();
|
|
@ -80,7 +80,7 @@ const workers = ref();
|
||||||
<QItemSection v-if="workers">
|
<QItemSection v-if="workers">
|
||||||
<VnSelectFilter
|
<VnSelectFilter
|
||||||
:label="t('Salesperson')"
|
:label="t('Salesperson')"
|
||||||
v-model="params.salesPersonFk"
|
v-model="params.salesPerson"
|
||||||
@update:model-value="searchFn()"
|
@update:model-value="searchFn()"
|
||||||
:options="workers"
|
:options="workers"
|
||||||
option-value="id"
|
option-value="id"
|
||||||
|
@ -128,22 +128,7 @@ const workers = ref();
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<i18n>
|
<i18n>
|
||||||
en:
|
|
||||||
params:
|
|
||||||
identifier: Identifier
|
|
||||||
socialName: Social name
|
|
||||||
salesPerson: Salesperson
|
|
||||||
phone: Phone
|
|
||||||
city: City
|
|
||||||
email: Email
|
|
||||||
es:
|
es:
|
||||||
params:
|
|
||||||
identifier: Identificador
|
|
||||||
socialName: Razón social
|
|
||||||
salesPerson: Comercial
|
|
||||||
phone: Teléfono
|
|
||||||
city: Población
|
|
||||||
email: Email
|
|
||||||
Identifier: Identificador
|
Identifier: Identificador
|
||||||
Social name: Razón social
|
Social name: Razón social
|
||||||
Salesperson: Comercial
|
Salesperson: Comercial
|
|
@ -8,7 +8,7 @@ import { useArrayData } from 'composables/useArrayData';
|
||||||
import { useStateStore } from 'stores/useStateStore';
|
import { useStateStore } from 'stores/useStateStore';
|
||||||
|
|
||||||
import CustomerNotificationsFilter from './CustomerNotificationsFilter.vue';
|
import CustomerNotificationsFilter from './CustomerNotificationsFilter.vue';
|
||||||
import CustomerDescriptorProxy from './Card/CustomerDescriptorProxy.vue';
|
import CustomerDescriptorProxy from '../Card/CustomerDescriptorProxy.vue';
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
const stateStore = useStateStore();
|
const stateStore = useStateStore();
|
|
@ -4,8 +4,8 @@ import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
import FetchData from 'components/FetchData.vue';
|
import FetchData from 'components/FetchData.vue';
|
||||||
import VnFilterPanel from 'src/components/ui/VnFilterPanel.vue';
|
import VnFilterPanel from 'src/components/ui/VnFilterPanel.vue';
|
||||||
import VnSelectFilter from 'components/common/VnSelectFilter.vue';
|
|
||||||
import VnInput from 'src/components/common/VnInput.vue';
|
import VnInput from 'src/components/common/VnInput.vue';
|
||||||
|
import VnSelectFilter from 'components/common/VnSelectFilter.vue';
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
|
@ -15,18 +15,18 @@ const props = defineProps({
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const clients = ref();
|
|
||||||
const cities = ref();
|
const cities = ref();
|
||||||
|
const clients = ref();
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<FetchData
|
<FetchData
|
||||||
url="Clients"
|
|
||||||
:filter="{ where: { role: 'socialName' } }"
|
:filter="{ where: { role: 'socialName' } }"
|
||||||
@on-fetch="(data) => (clients = data)"
|
@on-fetch="(data) => (clients = data)"
|
||||||
auto-load
|
auto-load
|
||||||
|
url="Clients"
|
||||||
/>
|
/>
|
||||||
<FetchData url="Towns" @on-fetch="(data) => (cities = data)" auto-load />
|
<FetchData @on-fetch="(data) => (cities = data)" auto-load url="Towns" />
|
||||||
<VnFilterPanel :data-key="props.dataKey" :search-button="true">
|
<VnFilterPanel :data-key="props.dataKey" :search-button="true">
|
||||||
<template #tags="{ tag, formatFn }">
|
<template #tags="{ tag, formatFn }">
|
||||||
<div class="q-gutter-x-xs">
|
<div class="q-gutter-x-xs">
|
||||||
|
@ -41,8 +41,8 @@ const cities = ref();
|
||||||
<QItemSection>
|
<QItemSection>
|
||||||
<VnInput
|
<VnInput
|
||||||
:label="t('Identifier')"
|
:label="t('Identifier')"
|
||||||
v-model="params.identifier"
|
|
||||||
is-outlined
|
is-outlined
|
||||||
|
v-model="params.identifier"
|
||||||
/>
|
/>
|
||||||
</QItemSection>
|
</QItemSection>
|
||||||
</QItem>
|
</QItem>
|
||||||
|
@ -53,20 +53,20 @@ const cities = ref();
|
||||||
</QItemSection>
|
</QItemSection>
|
||||||
<QItemSection v-if="clients">
|
<QItemSection v-if="clients">
|
||||||
<VnSelectFilter
|
<VnSelectFilter
|
||||||
|
:input-debounce="0"
|
||||||
:label="t('Social name')"
|
:label="t('Social name')"
|
||||||
v-model="params.socialName"
|
|
||||||
@update:model-value="searchFn()"
|
|
||||||
:options="clients"
|
:options="clients"
|
||||||
option-value="socialName"
|
@update:model-value="searchFn()"
|
||||||
option-label="socialName"
|
|
||||||
emit-value
|
|
||||||
map-options
|
|
||||||
use-input
|
|
||||||
hide-selected
|
|
||||||
dense
|
dense
|
||||||
|
emit-value
|
||||||
|
hide-selected
|
||||||
|
map-options
|
||||||
|
option-label="socialName"
|
||||||
|
option-value="socialName"
|
||||||
outlined
|
outlined
|
||||||
rounded
|
rounded
|
||||||
:input-debounce="0"
|
use-input
|
||||||
|
v-model="params.socialName"
|
||||||
/>
|
/>
|
||||||
</QItemSection>
|
</QItemSection>
|
||||||
</QItem>
|
</QItem>
|
||||||
|
@ -77,33 +77,33 @@ const cities = ref();
|
||||||
</QItemSection>
|
</QItemSection>
|
||||||
<QItemSection v-if="cities">
|
<QItemSection v-if="cities">
|
||||||
<VnSelectFilter
|
<VnSelectFilter
|
||||||
|
:input-debounce="0"
|
||||||
:label="t('City')"
|
:label="t('City')"
|
||||||
v-model="params.city"
|
|
||||||
@update:model-value="searchFn()"
|
|
||||||
:options="cities"
|
:options="cities"
|
||||||
option-value="name"
|
@update:model-value="searchFn()"
|
||||||
option-label="name"
|
|
||||||
emit-value
|
|
||||||
map-options
|
|
||||||
use-input
|
|
||||||
hide-selected
|
|
||||||
dense
|
dense
|
||||||
|
emit-value
|
||||||
|
hide-selected
|
||||||
|
map-options
|
||||||
|
option-label="name"
|
||||||
|
option-value="name"
|
||||||
outlined
|
outlined
|
||||||
rounded
|
rounded
|
||||||
:input-debounce="0"
|
use-input
|
||||||
|
v-model="params.city"
|
||||||
/>
|
/>
|
||||||
</QItemSection>
|
</QItemSection>
|
||||||
</QItem>
|
</QItem>
|
||||||
|
|
||||||
<QItem class="q-mb-sm">
|
<QItem class="q-mb-sm">
|
||||||
<QItemSection>
|
<QItemSection>
|
||||||
<VnInput :label="t('Phone')" v-model="params.phone" is-outlined />
|
<VnInput :label="t('Phone')" is-outlined v-model="params.phone" />
|
||||||
</QItemSection>
|
</QItemSection>
|
||||||
</QItem>
|
</QItem>
|
||||||
|
|
||||||
<QItem class="q-mb-sm">
|
<QItem class="q-mb-sm">
|
||||||
<QItemSection>
|
<QItemSection>
|
||||||
<VnInput :label="t('Email')" v-model="params.email" is-outlined />
|
<VnInput :label="t('Email')" is-outlined v-model="params.email" />
|
||||||
</QItemSection>
|
</QItemSection>
|
||||||
</QItem>
|
</QItem>
|
||||||
<QSeparator />
|
<QSeparator />
|
|
@ -7,7 +7,7 @@ import { useStateStore } from 'stores/useStateStore';
|
||||||
import { useArrayData } from 'composables/useArrayData';
|
import { useArrayData } from 'composables/useArrayData';
|
||||||
import VnPaginate from 'components/ui/VnPaginate.vue';
|
import VnPaginate from 'components/ui/VnPaginate.vue';
|
||||||
import VnConfirm from 'components/ui/VnConfirm.vue';
|
import VnConfirm from 'components/ui/VnConfirm.vue';
|
||||||
import CustomerDescriptorProxy from './Card/CustomerDescriptorProxy.vue';
|
import CustomerDescriptorProxy from '../Card/CustomerDescriptorProxy.vue';
|
||||||
import { toDate, toCurrency } from 'filters/index';
|
import { toDate, toCurrency } from 'filters/index';
|
||||||
import CustomerPaymentsFilter from './CustomerPaymentsFilter.vue';
|
import CustomerPaymentsFilter from './CustomerPaymentsFilter.vue';
|
||||||
|
|
|
@ -15,6 +15,7 @@ export default {
|
||||||
'CustomerPayments',
|
'CustomerPayments',
|
||||||
'CustomerExtendedList',
|
'CustomerExtendedList',
|
||||||
'CustomerNotifications',
|
'CustomerNotifications',
|
||||||
|
'CustomerDefaulter',
|
||||||
],
|
],
|
||||||
card: ['CustomerBasicData'],
|
card: ['CustomerBasicData'],
|
||||||
},
|
},
|
||||||
|
@ -49,7 +50,8 @@ export default {
|
||||||
title: 'webPayments',
|
title: 'webPayments',
|
||||||
icon: 'vn:onlinepayment',
|
icon: 'vn:onlinepayment',
|
||||||
},
|
},
|
||||||
component: () => import('src/pages/Customer/CustomerPayments.vue'),
|
component: () =>
|
||||||
|
import('src/pages/Customer/Payments/CustomerPayments.vue'),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'extendedList',
|
path: 'extendedList',
|
||||||
|
@ -59,7 +61,9 @@ export default {
|
||||||
icon: 'vn:client',
|
icon: 'vn:client',
|
||||||
},
|
},
|
||||||
component: () =>
|
component: () =>
|
||||||
import('src/pages/Customer/CustomerExtendedList.vue'),
|
import(
|
||||||
|
'src/pages/Customer/ExtendedList/CustomerExtendedList.vue'
|
||||||
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'notifications',
|
path: 'notifications',
|
||||||
|
@ -69,7 +73,19 @@ export default {
|
||||||
icon: 'notifications',
|
icon: 'notifications',
|
||||||
},
|
},
|
||||||
component: () =>
|
component: () =>
|
||||||
import('src/pages/Customer/CustomerNotifications.vue'),
|
import(
|
||||||
|
'src/pages/Customer/Notifications/CustomerNotifications.vue'
|
||||||
|
),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'defaulter',
|
||||||
|
name: 'CustomerDefaulter',
|
||||||
|
meta: {
|
||||||
|
title: 'defaulter',
|
||||||
|
icon: 'vn:risk',
|
||||||
|
},
|
||||||
|
component: () =>
|
||||||
|
import('src/pages/Customer/Defaulter/CustomerDefaulter.vue'),
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,11 +1,10 @@
|
||||||
import { vi, describe, expect, it, beforeAll, afterEach } from 'vitest';
|
import { vi, describe, expect, it, beforeAll, afterEach } from 'vitest';
|
||||||
import { createWrapper, axios } from 'app/test/vitest/helper';
|
import { createWrapper, axios } from 'app/test/vitest/helper';
|
||||||
import CustomerPayments from 'pages/Customer/CustomerPayments.vue';
|
import CustomerPayments from 'src/pages/Customer/Payments/CustomerPayments.vue';
|
||||||
|
|
||||||
describe('CustomerPayments', () => {
|
describe('CustomerPayments', () => {
|
||||||
let vm;
|
let vm;
|
||||||
|
|
||||||
|
|
||||||
beforeAll(() => {
|
beforeAll(() => {
|
||||||
vm = createWrapper(CustomerPayments, {
|
vm = createWrapper(CustomerPayments, {
|
||||||
global: {
|
global: {
|
||||||
|
@ -13,7 +12,7 @@ describe('CustomerPayments', () => {
|
||||||
mocks: {
|
mocks: {
|
||||||
fetch: vi.fn(),
|
fetch: vi.fn(),
|
||||||
},
|
},
|
||||||
}
|
},
|
||||||
}).vm;
|
}).vm;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -28,11 +27,10 @@ describe('CustomerPayments', () => {
|
||||||
|
|
||||||
await vm.confirmTransaction({ id: 1 });
|
await vm.confirmTransaction({ id: 1 });
|
||||||
|
|
||||||
|
|
||||||
expect(vm.quasar.notify).toHaveBeenCalledWith(
|
expect(vm.quasar.notify).toHaveBeenCalledWith(
|
||||||
expect.objectContaining({
|
expect.objectContaining({
|
||||||
message: 'Payment confirmed',
|
message: 'Payment confirmed',
|
||||||
type: 'positive'
|
type: 'positive',
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue