Merge branch 'dev' into 6999-AddTabToFilter
gitea/salix-front/pipeline/pr-dev This commit looks good Details

This commit is contained in:
Jon Elias 2024-11-20 07:25:50 +00:00
commit 26ee54c488
23 changed files with 99 additions and 170 deletions

View File

@ -0,0 +1,40 @@
<script setup>
defineProps({ row: { type: Object, required: true } });
</script>
<template>
<span>
<QIcon
v-if="row.isTaxDataChecked === 0"
name="vn:no036"
color="primary"
size="xs"
>
<QTooltip>{{ $t('salesTicketsTable.noVerifiedData') }}</QTooltip>
</QIcon>
<QIcon v-if="row.hasTicketRequest" name="vn:buyrequest" color="primary" size="xs">
<QTooltip>{{ $t('salesTicketsTable.purchaseRequest') }}</QTooltip>
</QIcon>
<QIcon v-if="row.itemShortage" name="vn:unavailable" color="primary" size="xs">
<QTooltip>{{ $t('salesTicketsTable.notVisible') }}</QTooltip>
</QIcon>
<QIcon v-if="row.isFreezed" name="vn:frozen" color="primary" size="xs">
<QTooltip>{{ $t('salesTicketsTable.clientFrozen') }}</QTooltip>
</QIcon>
<QIcon
v-if="row.risk"
name="vn:risk"
:color="row.hasHighRisk ? 'negative' : 'primary'"
size="xs"
>
<QTooltip>
{{ $t('salesTicketsTable.risk') }}: {{ row.risk - row.credit }}
</QTooltip>
</QIcon>
<QIcon v-if="row.hasComponentLack" name="vn:components" color="primary" size="xs">
<QTooltip>{{ $t('salesTicketsTable.componentLack') }}</QTooltip>
</QIcon>
<QIcon v-if="row.isTooLittle" name="vn:isTooLittle" color="primary" size="xs">
<QTooltip>{{ $t('salesTicketsTable.tooLittle') }}</QTooltip>
</QIcon>
</span>
</template>

View File

@ -324,6 +324,8 @@ function handleOnDataSaved(_) {
} }
function handleScroll() { function handleScroll() {
if ($props.crudModel.disableInfiniteScroll) return;
const tMiddle = tableRef.value.$el.querySelector('.q-table__middle'); const tMiddle = tableRef.value.$el.querySelector('.q-table__middle');
const { scrollHeight, scrollTop, clientHeight } = tMiddle; const { scrollHeight, scrollTop, clientHeight } = tMiddle;
const isAtBottom = Math.abs(scrollHeight - scrollTop - clientHeight) <= 40; const isAtBottom = Math.abs(scrollHeight - scrollTop - clientHeight) <= 40;

View File

@ -202,7 +202,10 @@ async function fetchFilter(val) {
if (fields) fetchOptions.fields = fields; if (fields) fetchOptions.fields = fields;
if (sortBy) fetchOptions.order = sortBy; if (sortBy) fetchOptions.order = sortBy;
arrayData.reset(['skip', 'filter.skip', 'page']); arrayData.reset(['skip', 'filter.skip', 'page']);
return (await arrayData.applyFilter({ filter: fetchOptions }))?.data;
const { data } = await arrayData.applyFilter({ filter: fetchOptions });
setOptions(data);
return data;
} }
async function filterHandler(val, update) { async function filterHandler(val, update) {

View File

@ -584,15 +584,15 @@ worker:
role: Role role: Role
sipExtension: Extension sipExtension: Extension
locker: Locker locker: Locker
fiDueDate: Fecha de caducidad del DNI fiDueDate: FI due date
sex: Sexo sex: Sex
seniority: Antigüedad seniority: Seniority
fi: DNI/NIE/NIF fi: DNI/NIE/NIF
birth: Fecha de nacimiento birth: Birth
isFreelance: Autónomo isFreelance: Freelance
isSsDiscounted: Bonificación SS isSsDiscounted: Bonificación SS
hasMachineryAuthorized: Autorizado para llevar maquinaria hasMachineryAuthorized: Machinery authorized
isDisable: Trabajador desactivado isDisable: Disable
notificationsManager: notificationsManager:
activeNotifications: Active notifications activeNotifications: Active notifications
availableNotifications: Available notifications availableNotifications: Available notifications
@ -708,7 +708,7 @@ supplier:
supplierName: Supplier name supplierName: Supplier name
basicData: basicData:
workerFk: Responsible workerFk: Responsible
isSerious: Verified isReal: Verified
isActive: Active isActive: Active
isPayMethodChecked: PayMethod checked isPayMethodChecked: PayMethod checked
note: Notes note: Notes

View File

@ -580,9 +580,9 @@ worker:
newWorker: Nuevo trabajador newWorker: Nuevo trabajador
summary: summary:
boss: Jefe boss: Jefe
phoneExtension: Extensión de teléfono phoneExtension: Ext. de teléfono
entPhone: Teléfono de empresa entPhone: Tel. de empresa
personalPhone: Teléfono personal personalPhone: Tel. personal
noBoss: Sin jefe noBoss: Sin jefe
userData: Datos de usuario userData: Datos de usuario
userId: ID del usuario userId: ID del usuario
@ -703,7 +703,7 @@ supplier:
supplierName: Nombre del proveedor supplierName: Nombre del proveedor
basicData: basicData:
workerFk: Responsable workerFk: Responsable
isSerious: Verificado isReal: Verificado
isActive: Activo isActive: Activo
isPayMethodChecked: Método de pago validado isPayMethodChecked: Método de pago validado
note: Notas note: Notas

View File

@ -320,7 +320,7 @@ const sumRisk = ({ clientRisks }) => {
:value="entity.recommendedCredit" :value="entity.recommendedCredit"
/> />
</QCard> </QCard>
<QCard class="vn-one"> <QCard class="vn-max">
<VnTitle :text="t('Latest tickets')" /> <VnTitle :text="t('Latest tickets')" />
<CustomerSummaryTable /> <CustomerSummaryTable />
</QCard> </QCard>

View File

@ -440,7 +440,7 @@ function handleOnDataSave({ CrudModelRef }) {
selection: 'multiple', selection: 'multiple',
}" }"
:crud-model="{ :crud-model="{
paginate: false, disableInfiniteScroll: true,
}" }"
v-model:selected="rowsSelected" v-model:selected="rowsSelected"
:row-click="saveOnRowChange" :row-click="saveOnRowChange"

View File

@ -27,7 +27,7 @@ function exprBuilder(param, value) {
const columns = computed(() => [ const columns = computed(() => [
{ {
label: t('salesOrdersTable.dateSend'), label: t('globals.landed'),
name: 'dateSend', name: 'dateSend',
field: 'dateSend', field: 'dateSend',
align: 'left', align: 'left',

View File

@ -15,6 +15,7 @@ import { toCurrency, dateRange, dashIfEmpty } from 'src/filters';
import RightMenu from 'src/components/common/RightMenu.vue'; import RightMenu from 'src/components/common/RightMenu.vue';
import MonitorTicketSearchbar from './MonitorTicketSearchbar.vue'; import MonitorTicketSearchbar from './MonitorTicketSearchbar.vue';
import MonitorTicketFilter from './MonitorTicketFilter.vue'; import MonitorTicketFilter from './MonitorTicketFilter.vue';
import TicketProblems from 'src/components/TicketProblems.vue';
const DEFAULT_AUTO_REFRESH = 2 * 60 * 1000; // 2min in ms const DEFAULT_AUTO_REFRESH = 2 * 60 * 1000; // 2min in ms
const { t } = useI18n(); const { t } = useI18n();
@ -23,13 +24,18 @@ const tableRef = ref(null);
const provinceOpts = ref([]); const provinceOpts = ref([]);
const stateOpts = ref([]); const stateOpts = ref([]);
const zoneOpts = ref([]); const zoneOpts = ref([]);
const visibleColumns = ref([]);
const { viewSummary } = useSummaryDialog(); const { viewSummary } = useSummaryDialog();
const from = Date.vnNew(); const from = Date.vnNew();
from.setHours(0, 0, 0, 0); from.setHours(0, 0, 0, 0);
const to = new Date(from.getTime()); const to = new Date(from.getTime());
to.setDate(to.getDate() + 1); to.setDate(to.getDate() + 1);
to.setHours(23, 59, 59, 999); to.setHours(23, 59, 59, 999);
const stateColors = {
notice: 'info',
success: 'positive',
warning: 'warning',
alert: 'negative',
};
function exprBuilder(param, value) { function exprBuilder(param, value) {
switch (param) { switch (param) {
@ -224,7 +230,7 @@ const columns = computed(() => [
{ {
title: t('salesTicketsTable.goToLines'), title: t('salesTicketsTable.goToLines'),
icon: 'vn:lines', icon: 'vn:lines',
color: 'priamry', color: 'primary',
action: (row) => openTab(row.id), action: (row) => openTab(row.id),
isPrimary: true, isPrimary: true,
attrs: { attrs: {
@ -235,7 +241,7 @@ const columns = computed(() => [
{ {
title: t('salesTicketsTable.preview'), title: t('salesTicketsTable.preview'),
icon: 'preview', icon: 'preview',
color: 'priamry', color: 'primary',
action: (row) => viewSummary(row.id, TicketSummary), action: (row) => viewSummary(row.id, TicketSummary),
isPrimary: true, isPrimary: true,
attrs: { attrs: {
@ -253,10 +259,10 @@ const getBadgeAttrs = (date) => {
let timeTicket = new Date(date); let timeTicket = new Date(date);
timeTicket.setHours(0, 0, 0, 0); timeTicket.setHours(0, 0, 0, 0);
let comparation = today - timeTicket; let timeDiff = today - timeTicket;
if (comparation == 0) return { color: 'warning', 'text-color': 'black' }; if (timeDiff == 0) return { color: 'warning', 'text-color': 'black' };
if (comparation < 0) return { color: 'success', 'text-color': 'black' }; if (timeDiff < 0) return { color: 'success', 'text-color': 'black' };
return { color: 'transparent', 'text-color': 'white' }; return { color: 'transparent', 'text-color': 'white' };
}; };
@ -271,13 +277,6 @@ const autoRefreshHandler = (value) => {
} }
}; };
const stateColors = {
notice: 'info',
success: 'positive',
warning: 'warning',
alert: 'negative',
};
const totalPriceColor = (ticket) => { const totalPriceColor = (ticket) => {
const total = parseInt(ticket.totalWithVat); const total = parseInt(ticket.totalWithVat);
if (total > 0 && total < 50) return 'warning'; if (total > 0 && total < 50) return 'warning';
@ -285,10 +284,10 @@ const totalPriceColor = (ticket) => {
const formatShippedDate = (date) => { const formatShippedDate = (date) => {
if (!date) return '-'; if (!date) return '-';
const split1 = date.split('T'); const dateSplit = date.split('T');
const [year, month, day] = split1[0].split('-'); const [year, month, day] = dateSplit[0].split('-');
const _date = new Date(year, month - 1, day); const newDate = new Date(year, month - 1, day);
return toDateFormat(_date); return toDateFormat(newDate);
}; };
const openTab = (id) => const openTab = (id) =>
@ -336,7 +335,6 @@ const openTab = (id) =>
:expr-builder="exprBuilder" :expr-builder="exprBuilder"
:offset="50" :offset="50"
:columns="columns" :columns="columns"
:visible-columns="visibleColumns"
:right-search="false" :right-search="false"
default-mode="table" default-mode="table"
auto-load auto-load
@ -366,61 +364,7 @@ const openTab = (id) =>
</QCheckbox> </QCheckbox>
</template> </template>
<template #column-totalProblems="{ row }"> <template #column-totalProblems="{ row }">
<span> <TicketProblems :row="row" />
<QIcon
v-if="row.isTaxDataChecked === 0"
name="vn:no036"
color="primary"
size="xs"
>
<QTooltip>{{ $t('salesTicketsTable.noVerifiedData') }}</QTooltip>
</QIcon>
<QIcon
v-if="row.hasTicketRequest"
name="vn:buyrequest"
color="primary"
size="xs"
>
<QTooltip>{{ $t('salesTicketsTable.purchaseRequest') }}</QTooltip>
</QIcon>
<QIcon
v-if="row.itemShortage"
name="vn:unavailable"
color="primary"
size="xs"
>
<QTooltip>{{ $t('salesTicketsTable.notVisible') }}</QTooltip>
</QIcon>
<QIcon v-if="row.isFreezed" name="vn:frozen" color="primary" size="xs">
<QTooltip>{{ $t('salesTicketsTable.clientFrozen') }}</QTooltip>
</QIcon>
<QIcon
v-if="row.risk"
name="vn:risk"
:color="row.hasHighRisk ? 'negative' : 'primary'"
size="xs"
>
<QTooltip
>{{ $t('salesTicketsTable.risk') }}: {{ row.risk }}</QTooltip
>
</QIcon>
<QIcon
v-if="row.hasComponentLack"
name="vn:components"
color="primary"
size="xs"
>
<QTooltip>{{ $t('salesTicketsTable.componentLack') }}</QTooltip>
</QIcon>
<QIcon
v-if="row.isTooLittle"
name="vn:isTooLittle"
color="primary"
size="xs"
>
<QTooltip>{{ $t('salesTicketsTable.tooLittle') }}</QTooltip>
</QIcon>
</span>
</template> </template>
<template #column-id="{ row }"> <template #column-id="{ row }">
<span class="link" @click.stop.prevent> <span class="link" @click.stop.prevent>
@ -475,7 +419,7 @@ const openTab = (id) =>
</QIcon> </QIcon>
</template> </template>
<template #column-zoneFk="{ row }"> <template #column-zoneFk="{ row }">
<div @click.stop.prevent :title="row.zoneName"> <div v-if="row.zoneFk" @click.stop.prevent :title="row.zoneName">
<span class="link">{{ row.zoneName }}</span> <span class="link">{{ row.zoneName }}</span>
<ZoneDescriptorProxy :id="row.zoneFk" /> <ZoneDescriptorProxy :id="row.zoneFk" />
</div> </div>

View File

@ -11,7 +11,6 @@ salesClientsTable:
client: Client client: Client
salesOrdersTable: salesOrdersTable:
delete: Delete delete: Delete
dateSend: Send date
dateMake: Make date dateMake: Make date
deleteConfirmMessage: All the selected elements will be deleted. Are you sure you want to continue? deleteConfirmMessage: All the selected elements will be deleted. Are you sure you want to continue?
agency: Agency agency: Agency

View File

@ -11,7 +11,6 @@ salesClientsTable:
client: Cliente client: Cliente
salesOrdersTable: salesOrdersTable:
delete: Eliminar delete: Eliminar
dateSend: Fecha de envío
dateMake: Fecha de realización dateMake: Fecha de realización
deleteConfirmMessage: Todos los elementos seleccionados serán eliminados. ¿Seguro que quieres continuar? deleteConfirmMessage: Todos los elementos seleccionados serán eliminados. ¿Seguro que quieres continuar?
agency: Agencia agency: Agencia

View File

@ -76,8 +76,8 @@ const companySizes = [
</VnRow> </VnRow>
<VnRow> <VnRow>
<QCheckbox <QCheckbox
v-model="data.isSerious" v-model="data.isReal"
:label="t('supplier.basicData.isSerious')" :label="t('supplier.basicData.isReal')"
/> />
<QCheckbox <QCheckbox
v-model="data.isActive" v-model="data.isActive"

View File

@ -38,7 +38,7 @@ const filter = {
'payDemFk', 'payDemFk',
'payDay', 'payDay',
'isActive', 'isActive',
'isSerious', 'isReal',
'isTrucker', 'isTrucker',
'account', 'account',
], ],
@ -137,7 +137,7 @@ const getEntryQueryParams = (supplier) => {
<QTooltip>{{ t('Inactive supplier') }}</QTooltip> <QTooltip>{{ t('Inactive supplier') }}</QTooltip>
</QIcon> </QIcon>
<QIcon <QIcon
v-if="!supplier.isSerious" v-if="!supplier.isReal"
name="vn:supplierfalse" name="vn:supplierfalse"
color="primary" color="primary"
size="xs" size="xs"

View File

@ -83,7 +83,7 @@ const getUrl = (section) => `#/supplier/${entityId.value}/${section}`;
</VnLv> </VnLv>
<QCheckbox <QCheckbox
:label="t('supplier.summary.verified')" :label="t('supplier.summary.verified')"
v-model="supplier.isSerious" v-model="supplier.isReal"
:disable="true" :disable="true"
/> />
<QCheckbox <QCheckbox

View File

@ -688,7 +688,7 @@ watch(
}" }"
:create-as-dialog="false" :create-as-dialog="false"
:crud-model="{ :crud-model="{
paginate: false, disableInfiniteScroll: true,
}" }"
:default-remove="false" :default-remove="false"
:default-reset="false" :default-reset="false"

View File

@ -215,7 +215,7 @@ const requestComponentUpdate = async (ticket, isWithoutNegatives) => {
if (!newLanded) { if (!newLanded) {
notify(t('advanceTickets.noDeliveryZone'), 'negative'); notify(t('advanceTickets.noDeliveryZone'), 'negative');
return; throw new Error(t('advanceTickets.noDeliveryZone'));
} }
ticket.landed = newLanded.landed; ticket.landed = newLanded.landed;
@ -299,10 +299,10 @@ const splitTickets = async () => {
const { query, params } = await requestComponentUpdate(ticket, true); const { query, params } = await requestComponentUpdate(ticket, true);
await axios.post(query, params); await axios.post(query, params);
progressAdd(ticket.futureId); progressAdd(ticket.futureId);
} catch (error) { } catch (e) {
splitErrors.value.push({ splitErrors.value.push({
id: ticket.futureId, id: ticket.futureId,
reason: error.response?.data?.error?.message, reason: e.message || e.response?.data?.error?.message,
}); });
progressAdd(ticket.futureId); progressAdd(ticket.futureId);
} }

View File

@ -22,6 +22,7 @@ import CustomerDescriptorProxy from 'src/pages/Customer/Card/CustomerDescriptorP
import ZoneDescriptorProxy from 'src/pages/Zone/Card/ZoneDescriptorProxy.vue'; import ZoneDescriptorProxy from 'src/pages/Zone/Card/ZoneDescriptorProxy.vue';
import { toTimeFormat } from 'src/filters/date'; import { toTimeFormat } from 'src/filters/date';
import InvoiceOutDescriptorProxy from 'src/pages/InvoiceOut/Card/InvoiceOutDescriptorProxy.vue'; import InvoiceOutDescriptorProxy from 'src/pages/InvoiceOut/Card/InvoiceOutDescriptorProxy.vue';
import TicketProblems from 'src/components/TicketProblems.vue';
const route = useRoute(); const route = useRoute();
const router = useRouter(); const router = useRouter();
@ -490,66 +491,7 @@ function setReference(data) {
}" }"
> >
<template #column-statusIcons="{ row }"> <template #column-statusIcons="{ row }">
<div class="q-gutter-x-xs"> <TicketProblems :row="row" />
<QIcon
v-if="row.isTaxDataChecked === 0"
color="primary"
name="vn:no036"
size="xs"
>
<QTooltip>
{{ t('No verified data') }}
</QTooltip>
</QIcon>
<QIcon
v-if="row.hasTicketRequest"
color="primary"
name="vn:buyrequest"
size="xs"
>
<QTooltip>
{{ t('Purchase request') }}
</QTooltip>
</QIcon>
<QIcon
v-if="row.itemShortage"
color="primary"
name="vn:unavailable"
size="xs"
>
<QTooltip>
{{ t('Not visible') }}
</QTooltip>
</QIcon>
<QIcon v-if="row.isFreezed" color="primary" name="vn:frozen" size="xs">
<QTooltip>
{{ t('Client frozen') }}
</QTooltip>
</QIcon>
<QIcon v-if="row.risk" color="primary" name="vn:risk" size="xs">
<QTooltip> {{ t('Risk') }}: {{ row.risk }} </QTooltip>
</QIcon>
<QIcon
v-if="row.hasComponentLack"
color="primary"
name="vn:components"
size="xs"
>
<QTooltip>
{{ t('Component lack') }}
</QTooltip>
</QIcon>
<QIcon
v-if="row.hasRounding"
color="primary"
name="sync_problem"
size="xs"
>
<QTooltip>
{{ t('Rounding') }}
</QTooltip>
</QIcon>
</div>
</template> </template>
<template #column-salesPersonFk="{ row }"> <template #column-salesPersonFk="{ row }">
<span class="link" @click.stop> <span class="link" @click.stop>

View File

@ -75,10 +75,10 @@ onBeforeMount(async () => {
<VnLinkPhone :phone-number="worker.phone" /> <VnLinkPhone :phone-number="worker.phone" />
</template> </template>
</VnLv> </VnLv>
<VnLv :value="worker.client?.phone"> <VnLv :value="advancedSummary?.client?.phone">
<template #label> <template #label>
{{ t('worker.summary.personalPhone') }} {{ t('worker.summary.personalPhone') }}
<VnLinkPhone :phone-number="worker.client?.phone" /> <VnLinkPhone :phone-number="advancedSummary?.client?.phone" />
</template> </template>
</VnLv> </VnLv>
</QCard> </QCard>
@ -86,12 +86,12 @@ onBeforeMount(async () => {
<VnTitle :url="basicDataUrl" :text="t('globals.summary.basicData')" /> <VnTitle :url="basicDataUrl" :text="t('globals.summary.basicData')" />
<VnLv <VnLv
:label="t('worker.summary.fiDueDate')" :label="t('worker.summary.fiDueDate')"
:value="toDate(worker.fiDueDate)" :value="toDate(advancedSummary.fiDueDate)"
/> />
<VnLv :label="t('worker.summary.sex')" :value="worker.sex" /> <VnLv :label="t('worker.summary.sex')" :value="worker.sex" />
<VnLv <VnLv
:label="t('worker.summary.seniority')" :label="t('worker.summary.seniority')"
:value="toDate(worker.seniority)" :value="toDate(advancedSummary.seniority)"
/> />
<VnLv :label="t('worker.summary.fi')" :value="advancedSummary.fi" /> <VnLv :label="t('worker.summary.fi')" :value="advancedSummary.fi" />
<VnLv <VnLv

View File

@ -306,7 +306,7 @@ async function autofillBic(worker) {
</VnRow> </VnRow>
<VnRow> <VnRow>
<VnInput <VnInput
:label="t('worker.create.street')" :label="t('globals.street')"
:model-value="uppercaseStreetModel(data).get()" :model-value="uppercaseStreetModel(data).get()"
@update:model-value="uppercaseStreetModel(data).set" @update:model-value="uppercaseStreetModel(data).set"
:disable="data.isFreelance" :disable="data.isFreelance"

View File

@ -1,2 +1,2 @@
videos/* reports/*
screenshots/* screenshots/*

View File

@ -28,7 +28,7 @@ describe('Logout', () => {
}); });
it('when token not exists', () => { it('when token not exists', () => {
cy.get('.q-list > [href="#/item"]').click(); cy.get('.q-list').first().should('be.visible').click();
cy.checkNotification('Authorization Required'); cy.checkNotification('Authorization Required');
}); });
}); });

View File

@ -5,6 +5,7 @@ describe('VnSearchBar', () => {
const idGap = '.q-item > .q-item__label'; const idGap = '.q-item > .q-item__label';
const vnTableRow = '.q-virtual-scroll__content'; const vnTableRow = '.q-virtual-scroll__content';
beforeEach(() => { beforeEach(() => {
cy.viewport(1280, 720);
cy.login('developer'); cy.login('developer');
cy.visit('#/customer/list'); cy.visit('#/customer/list');
}); });

View File

@ -106,7 +106,6 @@ Cypress.Commands.add('fillInForm', (obj, form = '.q-form > .q-card') => {
case 'select': case 'select':
cy.wrap(el).type(val); cy.wrap(el).type(val);
cy.get('.q-menu .q-item').contains(val).click(); cy.get('.q-menu .q-item').contains(val).click();
cy.get('body').click();
break; break;
case 'date': case 'date':
cy.wrap(el).type(val.split('-').join('')); cy.wrap(el).type(val.split('-').join(''));