perf: #6943 Create ticket from client
gitea/salix-front/pipeline/pr-master There was a failure building this commit Details

This commit is contained in:
Javier Segarra 2024-11-15 11:39:43 +01:00
parent 8e52bd0688
commit 87ba74bcfc
2 changed files with 48 additions and 26 deletions

View File

@ -19,7 +19,6 @@ import VnTitle from 'src/components/common/VnTitle.vue';
import ItemDescriptorProxy from 'src/pages/Item/Card/ItemDescriptorProxy.vue'; import ItemDescriptorProxy from 'src/pages/Item/Card/ItemDescriptorProxy.vue';
import ZoneDescriptorProxy from 'src/pages/Zone/Card/ZoneDescriptorProxy.vue'; import ZoneDescriptorProxy from 'src/pages/Zone/Card/ZoneDescriptorProxy.vue';
import VnSelect from 'src/components/common/VnSelect.vue'; import VnSelect from 'src/components/common/VnSelect.vue';
import TicketDescriptorMenu from './TicketDescriptorMenu.vue';
import VnToSummary from 'src/components/ui/VnToSummary.vue'; import VnToSummary from 'src/components/ui/VnToSummary.vue';
const route = useRoute(); const route = useRoute();
@ -87,10 +86,6 @@ async function changeState(value) {
function toTicketUrl(section) { function toTicketUrl(section) {
return '#/ticket/' + entityId.value + '/' + section; return '#/ticket/' + entityId.value + '/' + section;
} }
function isOnTicketCard() {
const currentPath = route.path;
return currentPath.startsWith('/ticket');
}
</script> </script>
<template> <template>

View File

@ -1,7 +1,7 @@
<script setup> <script setup>
import axios from 'axios'; import axios from 'axios';
import { computed, ref, onMounted } from 'vue'; import { computed, ref, onMounted } from 'vue';
import { useRoute } from 'vue-router'; import { useRoute, useRouter } from 'vue-router';
import { useStateStore } from 'stores/useStateStore'; import { useStateStore } from 'stores/useStateStore';
import { useI18n } from 'vue-i18n'; import { useI18n } from 'vue-i18n';
import { useQuasar } from 'quasar'; import { useQuasar } from 'quasar';
@ -24,6 +24,8 @@ import { toTimeFormat } from 'src/filters/date';
import InvoiceOutDescriptorProxy from '../InvoiceOut/Card/InvoiceOutDescriptorProxy.vue'; import InvoiceOutDescriptorProxy from '../InvoiceOut/Card/InvoiceOutDescriptorProxy.vue';
const route = useRoute(); const route = useRoute();
const router = useRouter();
const { t } = useI18n(); const { t } = useI18n();
const { viewSummary } = useSummaryDialog(); const { viewSummary } = useSummaryDialog();
const tableRef = ref(); const tableRef = ref();
@ -40,16 +42,18 @@ from.setDate(from.getDate() - 7);
const to = Date.vnNew(); const to = Date.vnNew();
to.setHours(23, 59, 0, 0); to.setHours(23, 59, 0, 0);
to.setDate(to.getDate() + 1); to.setDate(to.getDate() + 1);
const userParams = { const userParams = {
from: null, from: null,
to: null, to: null,
}; };
// Método para inicializar las variables desde la query string onMounted(() => {
initializeFromQuery();
stateStore.rightDrawer = true;
if (!route.query.createForm) return;
onClientSelected(JSON.parse(route.query.createForm));
});
const initializeFromQuery = () => { const initializeFromQuery = () => {
const query = route.query.table ? JSON.parse(route.query.table) : {}; const query = route.query.table ? JSON.parse(route.query.table) : {};
// Asigna los valores a las variables correspondientes
from.value = query.from || from.toISOString(); from.value = query.from || from.toISOString();
to.value = query.to || to.toISOString(); to.value = query.to || to.toISOString();
Object.assign(userParams, { from, to }); Object.assign(userParams, { from, to });
@ -206,13 +210,19 @@ const columns = computed(() => [
{ {
title: t('ticketList.summary'), title: t('ticketList.summary'),
icon: 'preview', icon: 'preview',
isPrimary: true, action: (row, evt) => {
action: (row) => viewSummary(row.id, TicketSummary), if (evt && evt.ctrlKey) {
const url = router.resolve({
params: { id: row.id },
name: 'TicketCard',
}).href;
window.open(url, '_blank');
} else viewSummary(row.id, TicketSummary);
},
}, },
], ],
}, },
]); ]);
function redirectToLines(id) { function redirectToLines(id) {
const url = `#/ticket/${id}/sale`; const url = `#/ticket/${id}/sale`;
window.open(url, '_blank'); window.open(url, '_blank');
@ -268,9 +278,8 @@ const fetchAddresses = async (formData) => {
if (!formData.clientId) return; if (!formData.clientId) return;
const filter = { const filter = {
fields: ['nickname', 'street', 'city', 'id'], fields: ['nickname', 'street', 'city', 'id', 'isActive'],
where: { isActive: true }, order: ['isDefaultAddress DESC', 'isActive DESC', 'nickname ASC'],
order: 'nickname ASC',
}; };
const params = { filter: JSON.stringify(filter) }; const params = { filter: JSON.stringify(filter) };
const { data } = await axios.get(`Clients/${formData.clientId}/addresses`, { const { data } = await axios.get(`Clients/${formData.clientId}/addresses`, {
@ -302,11 +311,6 @@ const getDateColor = (date) => {
if (comparation < 0) return 'bg-success'; if (comparation < 0) return 'bg-success';
}; };
onMounted(() => {
initializeFromQuery();
stateStore.rightDrawer = true;
});
async function makeInvoice(ticket) { async function makeInvoice(ticket) {
const ticketsIds = ticket.map((item) => item.id); const ticketsIds = ticket.map((item) => item.id);
const { data } = await axios.post(`Tickets/invoiceTicketsAndPdf`, { ticketsIds }); const { data } = await axios.post(`Tickets/invoiceTicketsAndPdf`, { ticketsIds });
@ -472,7 +476,7 @@ function setReference(data) {
urlCreate: 'Tickets/new', urlCreate: 'Tickets/new',
title: t('ticketList.createTicket'), title: t('ticketList.createTicket'),
onDataSaved: ({ id }) => tableRef.redirect(id), onDataSaved: ({ id }) => tableRef.redirect(id),
formInitialData: {}, formInitialData: { clientId: null },
}" }"
default-mode="table" default-mode="table"
:order="['shippedDate DESC', 'shippedHour ASC', 'zoneLanding ASC', 'id']" :order="['shippedDate DESC', 'shippedHour ASC', 'zoneLanding ASC', 'id']"
@ -616,6 +620,7 @@ function setReference(data) {
option-value="id" option-value="id"
option-label="name" option-label="name"
hide-selected hide-selected
required
@update:model-value="(client) => onClientSelected(data)" @update:model-value="(client) => onClientSelected(data)"
:sort-by="'id ASC'" :sort-by="'id ASC'"
> >
@ -635,7 +640,7 @@ function setReference(data) {
</VnRow> </VnRow>
<VnRow> <VnRow>
<VnSelect <VnSelect
url="Addresses" required
:label="t('ticket.create.address')" :label="t('ticket.create.address')"
v-model="data.addressId" v-model="data.addressId"
:options="addressesOptions" :options="addressesOptions"
@ -646,7 +651,22 @@ function setReference(data) {
@update:model-value="() => fetchAvailableAgencies(data)" @update:model-value="() => fetchAvailableAgencies(data)"
> >
<template #option="scope"> <template #option="scope">
<QItem v-bind="scope.itemProps"> <QItem
v-bind="scope.itemProps"
:class="{ disabled: !scope.opt.isActive }"
>
<QItemSection style="min-width: min-content" avatar>
<QIcon
v-if="
scope.opt.isActive &&
selectedClient?.defaultAddressFk === scope.opt.id
"
size="sm"
color="grey"
name="star"
class="fill-icon"
/>
</QItemSection>
<QItemSection> <QItemSection>
<QItemLabel> <QItemLabel>
{{ scope.opt.nickname }} {{ scope.opt.nickname }}
@ -680,6 +700,7 @@ function setReference(data) {
option-value="id" option-value="id"
option-label="name" option-label="name"
hide-selected hide-selected
required
@update:model-value="() => fetchAvailableAgencies(data)" @update:model-value="() => fetchAvailableAgencies(data)"
/> />
</div> </div>
@ -693,7 +714,6 @@ function setReference(data) {
option-value="agencyModeFk" option-value="agencyModeFk"
option-label="agencyMode" option-label="agencyMode"
hide-selected hide-selected
:disable="!data.clientId || !data.landed || !data.warehouseId"
/> />
</div> </div>
</VnRow> </VnRow>
@ -829,7 +849,14 @@ function setReference(data) {
</QTooltip> </QTooltip>
</QPageSticky> </QPageSticky>
</template> </template>
<style scoped>
.disabled,
.disabled *,
[disabled],
[disabled] * {
cursor: pointer !important;
}
</style>
<i18n> <i18n>
es: es:
Search ticket: Buscar ticket Search ticket: Buscar ticket