Compare commits

..

7 Commits

Author SHA1 Message Date
Jose Antonio Tubau 020cf18a73 Merge branch 'dev' into 7385-addDeliveredAndForecastColumnsOnRouteTicketsList
gitea/salix-front/pipeline/pr-dev This commit looks good Details
2025-04-28 07:02:57 +00:00
Jose Antonio Tubau 22390d9aef refactor: refs #7385 remove unnecessary apostrophes
gitea/salix-front/pipeline/pr-dev This commit looks good Details
2025-04-28 08:01:30 +02:00
Jose Antonio Tubau ccbcaa13b7 Merge branch 'dev' into 7385-addDeliveredAndForecastColumnsOnRouteTicketsList
gitea/salix-front/pipeline/pr-dev This commit looks good Details
2025-04-24 09:48:38 +02:00
Jose Antonio Tubau f4ecf9ad51 refactor: refs #7385 add detailed summary and ticket fields in English and Spanish locales
gitea/salix-front/pipeline/pr-dev There was a failure building this commit Details
2025-04-23 11:44:54 +02:00
Jose Antonio Tubau c3f60c68bc feat: refs #7385 add delivered and estimated info in routeTicket 2025-04-23 11:44:33 +02:00
Jose Antonio Tubau 2f20abf388 refactor: refs #7385 update ticket columns to use 'delivered' and 'forecast' fields in RouteSummary
gitea/salix-front/pipeline/pr-dev This commit looks good Details
2025-04-15 15:40:03 +02:00
Jose Antonio Tubau b25bd19bb5 feat: refs #7385 add delivery forecast and delivered fields to route summary and descriptor
gitea/salix-front/pipeline/pr-dev This commit looks good Details
2025-04-15 14:59:41 +02:00
6 changed files with 191 additions and 108 deletions

View File

@ -214,7 +214,7 @@ onBeforeMount(() => {
}); });
onMounted(async () => { onMounted(async () => {
if ($props.isEditable) document.addEventListener('mousedown', mousedownHandler); if ($props.isEditable) document.addEventListener('click', clickHandler);
mode.value = mode.value =
quasar.platform.is.mobile && !$props.disableOption?.card quasar.platform.is.mobile && !$props.disableOption?.card
? CARD_MODE ? CARD_MODE
@ -237,7 +237,7 @@ onMounted(async () => {
}); });
onUnmounted(async () => { onUnmounted(async () => {
if ($props.isEditable) document.removeEventListener('mousedown', mousedownHandler); if ($props.isEditable) document.removeEventListener('click', clickHandler);
}); });
watch( watch(
@ -385,7 +385,7 @@ function hasEditableFormat(column) {
if (isEditableColumn(column)) return 'editable-text'; if (isEditableColumn(column)) return 'editable-text';
} }
const mousedownHandler = async (event) => { const clickHandler = async (event) => {
const clickedElement = event.target.closest('td'); const clickedElement = event.target.closest('td');
const isDateElement = event.target.closest('.q-date'); const isDateElement = event.target.closest('.q-date');
const isTimeElement = event.target.closest('.q-time'); const isTimeElement = event.target.closest('.q-time');
@ -408,7 +408,6 @@ const mousedownHandler = async (event) => {
} }
if (isEditableColumn(column)) { if (isEditableColumn(column)) {
event.preventDefault();
await renderInput(Number(rowIndex), colField, clickedElement); await renderInput(Number(rowIndex), colField, clickedElement);
} }
}; };

View File

@ -68,6 +68,19 @@ onMounted(async () => {
<template #menu="{ entity }"> <template #menu="{ entity }">
<RouteDescriptorMenu :route="entity" /> <RouteDescriptorMenu :route="entity" />
</template> </template>
<template #actions="{ entity }">
<QCardActions class="flex justify-center" style="padding-inline: 0">
<QBtn
size="md"
icon="vn:delivery"
color="primary"
:href="`https://grafana.verdnatura.es/d/edkvyi479dbeob/pronostico-de-entregas?orgId=1&var-vRouteFk=${entity.id}`"
target="_blank"
>
<QTooltip>{{ $t('route.deliveryForecast') }}</QTooltip>
</QBtn>
</QCardActions>
</template>
</EntityDescriptor> </EntityDescriptor>
</template> </template>
<i18n> <i18n>

View File

@ -80,6 +80,20 @@ const ticketColumns = ref([
sortable: false, sortable: false,
align: 'left', align: 'left',
}, },
{
name: 'delivered',
label: t('route.delivered'),
field: (row) => dashIfEmpty(toDate(row?.delivered)),
sortable: false,
align: 'center',
},
{
name: 'forecast',
label: t('route.forecast'),
field: (row) => dashIfEmpty(toDate(row?.forecast)),
sortable: false,
align: 'center',
},
{ {
name: 'packages', name: 'packages',
label: t('route.summary.packages'), label: t('route.summary.packages'),
@ -267,61 +281,3 @@ const ticketColumns = ref([
</CardSummary> </CardSummary>
</div> </div>
</template> </template>
<i18n>
en:
route:
summary:
date: Date
agency: Agency
vehicle: Vehicle
driver: Driver
cost: Cost
started: Started time
finished: Finished time
kmStart: Km start
kmEnd: Km end
volume: Volume
packages: Packages
description: Description
tickets: Tickets
order: Order
street: Street
city: City
pc: PC
client: Client
state: State
m3:
packaging: Packaging
ticket: Ticket
closed: Closed
open: Open
yes: Yes
no: No
es:
route:
summary:
date: Fecha
agency: Agencia
vehicle: Vehículo
driver: Conductor
cost: Costo
started: Hora inicio
finished: Hora fin
kmStart: Km inicio
kmEnd: Km fin
volume: Volumen
packages: Bultos
description: Descripción
tickets: Tickets
order: Orden
street: Dirección fiscal
city: Población
pc: CP
client: Cliente
state: Estado
packaging: Encajado
closed: Cerrada
open: Abierta
yes:
no: No
</i18n>

View File

@ -24,49 +24,63 @@ const selectedRows = ref([]);
const columns = computed(() => [ const columns = computed(() => [
{ {
name: 'order', name: 'order',
label: t('Order'), label: t('route.ticket.order'),
field: (row) => dashIfEmpty(row?.priority), field: (row) => dashIfEmpty(row?.priority),
sortable: false, sortable: false,
align: 'center', align: 'center',
}, },
{ {
name: 'client', name: 'client',
label: t('Client'), label: t('route.ticket.client'),
field: (row) => row?.nickname, field: (row) => row?.nickname,
sortable: false, sortable: false,
align: 'left', align: 'left',
}, },
{ {
name: 'street', name: 'street',
label: t('Street'), label: t('route.ticket.street'),
field: (row) => row?.street, field: (row) => row?.street,
sortable: false, sortable: false,
align: 'left', align: 'left',
}, },
{ {
name: 'pc', name: 'pc',
label: t('PC'), label: t('route.ticket.PC'),
field: (row) => row?.postalCode, field: (row) => row?.postalCode,
sortable: false, sortable: false,
align: 'center', align: 'center',
}, },
{ {
name: 'city', name: 'city',
label: t('City'), label: t('route.ticket.city'),
field: (row) => row?.city, field: (row) => row?.city,
sortable: false, sortable: false,
align: 'left', align: 'left',
}, },
{ {
name: 'warehouse', name: 'warehouse',
label: t('Warehouse'), label: t('route.ticket.warehouse'),
field: (row) => row?.warehouseName, field: (row) => row?.warehouseName,
sortable: false, sortable: false,
align: 'left', align: 'left',
}, },
{
name: 'delivered',
label: t('route.ticket.delivered'),
field: (row) => dashIfEmpty(row?.delivered),
sortable: false,
align: 'left',
},
{
name: 'estimated',
label: t('route.ticket.estimated'),
field: (row) => dashIfEmpty(row?.estimated),
sortable: false,
align: 'left',
},
{ {
name: 'packages', name: 'packages',
label: t('Packages'), label: t('route.ticket.packages'),
field: (row) => row?.packages, field: (row) => row?.packages,
sortable: false, sortable: false,
align: 'center', align: 'center',
@ -80,14 +94,14 @@ const columns = computed(() => [
}, },
{ {
name: 'packaging', name: 'packaging',
label: t('Packaging'), label: t('route.ticket.packaging'),
field: (row) => row?.ipt, field: (row) => row?.ipt,
sortable: false, sortable: false,
align: 'center', align: 'center',
}, },
{ {
name: 'ticket', name: 'ticket',
label: t('Ticket'), label: t('route.ticket.ticket'),
field: (row) => row?.id, field: (row) => row?.id,
sortable: false, sortable: false,
align: 'center', align: 'center',
@ -188,8 +202,8 @@ const confirmRemove = (ticket) => {
.dialog({ .dialog({
component: VnConfirm, component: VnConfirm,
componentProps: { componentProps: {
title: t('Confirm removal from route'), title: t('route.ticket.confirmRemoval'),
message: t('Are you sure you want to remove this ticket from the route?'), message: t('route.ticket.confirmRemovalConfirmation'),
promise: () => removeTicket(ticket), promise: () => removeTicket(ticket),
}, },
}) })
@ -219,7 +233,7 @@ const openSmsDialog = async () => {
quasar.dialog({ quasar.dialog({
component: SendSmsDialog, component: SendSmsDialog,
componentProps: { componentProps: {
title: t('Send SMS to the selected tickets'), title: t('route.ticket.sendSmsTickets'),
url: 'Routes/sendSms', url: 'Routes/sendSms',
destinationFk: clientsId.toString(), destinationFk: clientsId.toString(),
destination: clientsPhone.toString(), destination: clientsPhone.toString(),
@ -240,18 +254,18 @@ const openSmsDialog = async () => {
<QDialog v-model="confirmationDialog"> <QDialog v-model="confirmationDialog">
<QCard style="min-width: 350px"> <QCard style="min-width: 350px">
<QCardSection> <QCardSection>
<p class="text-h6 q-ma-none">{{ t('Select the starting date') }}</p> <p class="text-h6 q-ma-none">{{ t('route.ticket.selectStartingDate') }}</p>
</QCardSection> </QCardSection>
<QCardSection class="q-pt-none"> <QCardSection class="q-pt-none">
<VnInputDate <VnInputDate
:label="t('Stating date')" :label="t('route.ticket.startingDate')"
v-model="startingDate" v-model="startingDate"
autofocus autofocus
/> />
</QCardSection> </QCardSection>
<QCardActions align="right"> <QCardActions align="right">
<QBtn flat :label="t('Cancel')" v-close-popup class="text-primary" /> <QBtn flat :label="t('globals.cancel')" v-close-popup class="text-primary" />
<QBtn color="primary" v-close-popup @click="cloneRoutes"> <QBtn color="primary" v-close-popup @click="cloneRoutes">
{{ t('globals.clone') }} {{ t('globals.clone') }}
</QBtn> </QBtn>
@ -262,7 +276,7 @@ const openSmsDialog = async () => {
<QToolbar class="justify-end"> <QToolbar class="justify-end">
<div id="st-actions" class="q-pa-sm"> <div id="st-actions" class="q-pa-sm">
<QBtn icon="vn:wand" color="primary" class="q-mr-sm" @click="sortRoutes"> <QBtn icon="vn:wand" color="primary" class="q-mr-sm" @click="sortRoutes">
<QTooltip>{{ t('Sort routes') }}</QTooltip> <QTooltip>{{ t('route.ticket.sortRoutes') }}</QTooltip>
</QBtn> </QBtn>
<QBtn <QBtn
icon="vn:buscaman" icon="vn:buscaman"
@ -271,7 +285,7 @@ const openSmsDialog = async () => {
:disable="!selectedRows?.length" :disable="!selectedRows?.length"
@click="goToBuscaman()" @click="goToBuscaman()"
> >
<QTooltip>{{ t('Open buscaman') }}</QTooltip> <QTooltip>{{ t('route.ticket.openBuscaman') }}</QTooltip>
</QBtn> </QBtn>
<QBtn <QBtn
icon="filter_alt" icon="filter_alt"
@ -280,7 +294,7 @@ const openSmsDialog = async () => {
:disable="!selectedRows?.length" :disable="!selectedRows?.length"
@click="deletePriorities" @click="deletePriorities"
> >
<QTooltip>{{ t('Delete priority') }}</QTooltip> <QTooltip>{{ t('route.ticket.deletePriority') }}</QTooltip>
</QBtn> </QBtn>
<QBtn <QBtn
icon="format_list_numbered" icon="format_list_numbered"
@ -290,7 +304,7 @@ const openSmsDialog = async () => {
> >
<QTooltip <QTooltip
>{{ >{{
t('Renumber all tickets in the order you see on the screen') t('route.ticket.renumberAllTickets')
}} }}
</QTooltip> </QTooltip>
</QBtn> </QBtn>
@ -301,7 +315,7 @@ const openSmsDialog = async () => {
:disable="!selectedRows?.length" :disable="!selectedRows?.length"
@click="openSmsDialog" @click="openSmsDialog"
> >
<QTooltip>{{ t('Send SMS to all clients') }}</QTooltip> <QTooltip>{{ t('route.ticket.sendSmsClients') }}</QTooltip>
</QBtn> </QBtn>
</div> </div>
</QToolbar> </QToolbar>
@ -339,7 +353,7 @@ const openSmsDialog = async () => {
@click="setHighestPriority(row, rows)" @click="setHighestPriority(row, rows)"
> >
<QTooltip> <QTooltip>
{{ t('Assign highest priority') }} {{ t('route.ticket.assignHighestPriority') }}
</QTooltip> </QTooltip>
</QIcon> </QIcon>
<VnInput <VnInput
@ -354,7 +368,7 @@ const openSmsDialog = async () => {
<QTd> <QTd>
<span class="link" @click="goToBuscaman(row)"> <span class="link" @click="goToBuscaman(row)">
{{ value }} {{ value }}
<QTooltip>{{ t('Open buscaman') }}</QTooltip> <QTooltip>{{ t('route.ticket.openBuscaman') }}</QTooltip>
</span> </span>
</QTd> </QTd>
</template> </template>
@ -411,7 +425,7 @@ const openSmsDialog = async () => {
@click="openTicketsDialog" @click="openTicketsDialog"
> >
<QTooltip> <QTooltip>
{{ t('Add ticket') }} {{ t('route.ticket.addTicket') }}
</QTooltip> </QTooltip>
</QBtn> </QBtn>
</QPageSticky> </QPageSticky>
@ -432,24 +446,3 @@ const openSmsDialog = async () => {
gap: 12px; gap: 12px;
} }
</style> </style>
<i18n>
es:
Order: Orden
Street: Dirección fiscal
City: Población
PC: CP
Client: Cliente
Warehouse: Almacén
Packages: Bultos
Packaging: Encajado
Confirm removal from route: Quitar de la ruta
Are you sure you want to remove this ticket from the route?: ¿Seguro que quieres quitar este ticket de la ruta?
Sort routes: Ordenar rutas
Open buscaman: Abrir buscaman
Delete priority: Borrar orden
Renumber all tickets in the order you see on the screen: Renumerar todos los tickets con el orden que ves por pantalla
Assign highest priority: Asignar máxima prioridad
Send SMS to all clients: Mandar sms a todos los clientes de las rutas
Send SMS to the selected tickets: Enviar SMS a los tickets seleccionados
Add ticket: Añadir ticket
</i18n>

View File

@ -1,6 +1,33 @@
route: route:
filter: filter:
Served: Served Served: Served
summary:
date: Date
agency: Agency
vehicle: Vehicle
driver: Driver
cost: Cost
started: Started time
finished: Finished time
kmStart: Km start
kmEnd: Km end
volume: Volume
packages: Packages
description: Description
tickets: Tickets
order: Order
street: Street
city: City
pc: PC
client: Client
state: State
m3:
packaging: Packaging
ticket: Ticket
closed: Closed
open: Open
yes: Yes
no: No
extendedList: extendedList:
selectStartingDate: Select the starting date selectStartingDate: Select the starting date
startingDate: Starting date startingDate: Starting date
@ -75,3 +102,47 @@ route:
searchInfo: You can search by route reference searchInfo: You can search by route reference
dated: Dated dated: Dated
preview: Preview preview: Preview
delivered: Delivered
forecast: Forecast
cmr:
search: Search Cmr
searchInfo: You can search Cmr by Id
params:
results: results
cmrFk: CMR id
hasCmrDms: Attached in gestdoc
true: Yes
false: No
ticketFk: Ticketd id
routeFk: Route id
countryFk: Country
clientFk: Client id
warehouseFk: Warehouse
shipped: Preparation date
viewCmr: View CMR
downloadCmrs: Download CMRs
search: General search
ticket:
order: Order
street: Street
city: City
PC: PC
client: Client
warehouse: Warehouse
delivered: Delivered
estimated: Estimated
packages: Packages
packaging: Packaging
ticket: Ticket
confirmRemoval: Confirm removal from route
confirmRemovalConfirmation: Are you sure you want to remove this ticket from the route?
selectStartingDate: Select the starting date
startingDate: Starting date
sortRoutes: Sort routes
openBuscaman: Open buscaman
deletePriority: Delete priority
renumberAllTickets: Renumber all tickets in the order you see on the screen
assignHighest: Assign highest priority
sendSmsTickets: Send SMS to the selected tickets
sendSmsClients: Send SMS to all clients
addTicket: Add ticket

View File

@ -1,6 +1,31 @@
route: route:
filter: filter:
Served: Servida Served: Servida
summary:
date: Fecha
agency: Agencia
vehicle: Vehículo
driver: Conductor
cost: Costo
started: Hora inicio
finished: Hora fin
kmStart: Km inicio
kmEnd: Km fin
volume: Volumen
packages: Bultos
description: Descripción
tickets: Tickets
order: Orden
street: Dirección fiscal
city: Población
pc: CP
client: Cliente
state: Estado
packaging: Encajado
closed: Cerrada
open: Abierta
yes:
no: No
extendedList: extendedList:
selectStartingDate: Seleccione la fecha de inicio selectStartingDate: Seleccione la fecha de inicio
statingDate: Fecha de inicio statingDate: Fecha de inicio
@ -76,13 +101,15 @@ route:
searchInfo: Puedes buscar por referencia de la ruta searchInfo: Puedes buscar por referencia de la ruta
dated: Fecha dated: Fecha
preview: Vista previa preview: Vista previa
delivered: Entregado
forecast: Pronóstico
cmr: cmr:
list: list:
results: resultados results: resultados
cmrFk: Id CMR cmrFk: Id CMR
hasCmrDms: Gestdoc hasCmrDms: Gestdoc
'true': true:
'false': 'No' false: No
ticketFk: Id ticket ticketFk: Id ticket
routeFk: Id ruta routeFk: Id ruta
country: País country: País
@ -90,3 +117,27 @@ route:
shipped: Fecha preparación shipped: Fecha preparación
viewCmr: Ver CMR viewCmr: Ver CMR
downloadCmrs: Descargar CMRs downloadCmrs: Descargar CMRs
ticket:
order: Orden
street: Dirección fiscal
city: Población
PC: CP
client: Cliente
warehouse: Almacén
delivered: Entregado
estimated: Pronóstico
packages: Bultos
packaging: Encajado
ticket: Ticket
confirmRemoval: Quitar de la ruta
confirmRemovalConfirmation: ¿Seguro que quieres quitar este ticket de la ruta?
selectStartingDate: Seleccionar fecha de inicio
startingDate: F. Inicio
sortRoutes: Ordenar rutas
openBuscaman: Abrir buscaman
deletePriority: Borrar orden
renumberAllTickets: Renumerar todos los tickets con el orden que ves por pantalla
assignHighest: Asignar máxima prioridad
sendSmsTickets: Enviar SMS a los tickets seleccionados
sendSmsClients: Mandar sms a todos los clientes de las rutas
addTicket: Añadir ticket