Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix-front into 8277-createEntryControl
gitea/salix-front/pipeline/pr-dev There was a failure building this commit Details

This commit is contained in:
Jorge Penadés 2025-04-11 16:30:22 +02:00
commit 648d60c81f
67 changed files with 296 additions and 316 deletions

View File

@ -1,12 +1,22 @@
<script setup> <script setup>
import { toCurrency } from 'src/filters'; import { toCurrency } from 'src/filters';
import { getValueFromPath } from 'src/composables/getValueFromPath';
defineProps({ row: { type: Object, required: true } }); const { row, visibleProblems = null } = defineProps({
row: { type: Object, required: true },
visibleProblems: { type: Array },
});
function showProblem(problem) {
const val = getValueFromPath(row, problem);
if (!visibleProblems) return val;
return !!(visibleProblems?.includes(problem) && val);
}
</script> </script>
<template> <template>
<span class="q-gutter-x-xs"> <span class="q-gutter-x-xs">
<router-link <router-link
v-if="row.claim?.claimFk" v-if="showProblem('claim.claimFk')"
:to="{ name: 'ClaimBasicData', params: { id: row.claim?.claimFk } }" :to="{ name: 'ClaimBasicData', params: { id: row.claim?.claimFk } }"
class="link" class="link"
> >
@ -18,7 +28,7 @@ defineProps({ row: { type: Object, required: true } });
</QIcon> </QIcon>
</router-link> </router-link>
<QIcon <QIcon
v-if="row?.isDeleted" v-if="showProblem('isDeleted')"
color="primary" color="primary"
name="vn:deletedTicket" name="vn:deletedTicket"
size="xs" size="xs"
@ -29,7 +39,7 @@ defineProps({ row: { type: Object, required: true } });
</QTooltip> </QTooltip>
</QIcon> </QIcon>
<QIcon <QIcon
v-if="row?.hasRisk" v-if="showProblem('hasRisk')"
name="vn:risk" name="vn:risk"
:color="row.hasHighRisk ? 'negative' : 'primary'" :color="row.hasHighRisk ? 'negative' : 'primary'"
size="xs" size="xs"
@ -40,51 +50,76 @@ defineProps({ row: { type: Object, required: true } });
</QTooltip> </QTooltip>
</QIcon> </QIcon>
<QIcon <QIcon
v-if="row?.hasComponentLack" v-if="showProblem('hasComponentLack')"
name="vn:components" name="vn:components"
color="primary" color="primary"
size="xs" size="xs"
> >
<QTooltip>{{ $t('salesTicketsTable.componentLack') }}</QTooltip> <QTooltip>{{ $t('salesTicketsTable.componentLack') }}</QTooltip>
</QIcon> </QIcon>
<QIcon v-if="row?.hasItemDelay" color="primary" size="xs" name="vn:hasItemDelay"> <QIcon
v-if="showProblem('hasItemDelay')"
color="primary"
size="xs"
name="vn:hasItemDelay"
>
<QTooltip> <QTooltip>
{{ $t('ticket.summary.hasItemDelay') }} {{ $t('ticket.summary.hasItemDelay') }}
</QTooltip> </QTooltip>
</QIcon> </QIcon>
<QIcon v-if="row?.hasItemLost" color="primary" size="xs" name="vn:hasItemLost"> <QIcon
v-if="showProblem('hasItemLost')"
color="primary"
size="xs"
name="vn:hasItemLost"
>
<QTooltip> <QTooltip>
{{ $t('salesTicketsTable.hasItemLost') }} {{ $t('salesTicketsTable.hasItemLost') }}
</QTooltip> </QTooltip>
</QIcon> </QIcon>
<QIcon <QIcon
v-if="row?.hasItemShortage" v-if="showProblem('hasItemShortage')"
name="vn:unavailable" name="vn:unavailable"
color="primary" color="primary"
size="xs" size="xs"
> >
<QTooltip>{{ $t('salesTicketsTable.notVisible') }}</QTooltip> <QTooltip>{{ $t('salesTicketsTable.notVisible') }}</QTooltip>
</QIcon> </QIcon>
<QIcon v-if="row?.hasRounding" color="primary" name="sync_problem" size="xs"> <QIcon
v-if="showProblem('hasRounding')"
color="primary"
name="sync_problem"
size="xs"
>
<QTooltip> <QTooltip>
{{ $t('ticketList.rounding') }} {{ $t('ticketList.rounding') }}
</QTooltip> </QTooltip>
</QIcon> </QIcon>
<QIcon <QIcon
v-if="row?.hasTicketRequest" v-if="showProblem('hasTicketRequest')"
name="vn:buyrequest" name="vn:buyrequest"
color="primary" color="primary"
size="xs" size="xs"
> >
<QTooltip>{{ $t('salesTicketsTable.purchaseRequest') }}</QTooltip> <QTooltip>{{ $t('salesTicketsTable.purchaseRequest') }}</QTooltip>
</QIcon> </QIcon>
<QIcon v-if="row?.isTaxDataChecked" name="vn:no036" color="primary" size="xs"> <QIcon
v-if="showProblem('isTaxDataChecked')"
name="vn:no036"
color="primary"
size="xs"
>
<QTooltip>{{ $t('salesTicketsTable.noVerifiedData') }}</QTooltip> <QTooltip>{{ $t('salesTicketsTable.noVerifiedData') }}</QTooltip>
</QIcon> </QIcon>
<QIcon v-if="row?.isFreezed" name="vn:frozen" color="primary" size="xs"> <QIcon v-if="showProblem('isFreezed')" name="vn:frozen" color="primary" size="xs">
<QTooltip>{{ $t('salesTicketsTable.clientFrozen') }}</QTooltip> <QTooltip>{{ $t('salesTicketsTable.clientFrozen') }}</QTooltip>
</QIcon> </QIcon>
<QIcon v-if="row?.isTooLittle" name="vn:isTooLittle" color="primary" size="xs"> <QIcon
v-if="showProblem('isTooLittle')"
name="vn:isTooLittle"
color="primary"
size="xs"
>
<QTooltip>{{ $t('salesTicketsTable.tooLittle') }}</QTooltip> <QTooltip>{{ $t('salesTicketsTable.tooLittle') }}</QTooltip>
</QIcon> </QIcon>
</span> </span>

View File

@ -1,65 +1,63 @@
import { vi, describe, expect, it, beforeEach, afterEach } from 'vitest'; import { vi, describe, expect, it, beforeEach, beforeAll, afterEach } from 'vitest';
import { createWrapper } from 'app/test/vitest/helper'; import { createWrapper } from 'app/test/vitest/helper';
import UserPanel from 'src/components/UserPanel.vue'; import UserPanel from 'src/components/UserPanel.vue';
import axios from 'axios'; import axios from 'axios';
import { useState } from 'src/composables/useState'; import { useState } from 'src/composables/useState';
vi.mock('src/utils/quasarLang', () => ({
default: vi.fn(),
}));
describe('UserPanel', () => { describe('UserPanel', () => {
let wrapper; let wrapper;
let vm; let vm;
let state; let state;
beforeEach(() => { beforeEach(() => {
wrapper = createWrapper(UserPanel, {}); wrapper = createWrapper(UserPanel, {});
state = useState(); state = useState();
state.setUser({ state.setUser({
id: 115, id: 115,
name: 'itmanagement', name: 'itmanagement',
nickname: 'itManagementNick', nickname: 'itManagementNick',
lang: 'en', lang: 'en',
darkMode: false, darkMode: false,
companyFk: 442, companyFk: 442,
warehouseFk: 1, warehouseFk: 1,
});
wrapper = wrapper.wrapper;
vm = wrapper.vm;
}); });
wrapper = wrapper.wrapper;
vm = wrapper.vm;
});
afterEach(() => { afterEach(() => {
vi.clearAllMocks(); vi.clearAllMocks();
}); });
it('should fetch warehouses data on mounted', async () => { it('should fetch warehouses data on mounted', async () => {
const fetchData = wrapper.findComponent({ name: 'FetchData' }); const fetchData = wrapper.findComponent({ name: 'FetchData' });
expect(fetchData.props('url')).toBe('Warehouses'); expect(fetchData.props('url')).toBe('Warehouses');
expect(fetchData.props('autoLoad')).toBe(true); expect(fetchData.props('autoLoad')).toBe(true);
}); });
it('should toggle dark mode correctly and update preferences', async () => { it('should toggle dark mode correctly and update preferences', async () => {
await vm.saveDarkMode(true); await vm.saveDarkMode(true);
expect(axios.patch).toHaveBeenCalledWith('/UserConfigs/115', { darkMode: true }); expect(axios.patch).toHaveBeenCalledWith('/UserConfigs/115', { darkMode: true });
expect(vm.user.darkMode).toBe(true); expect(vm.user.darkMode).toBe(true);
await vm.updatePreferences(); vm.updatePreferences();
expect(vm.darkMode).toBe(true); expect(vm.darkMode).toBe(true);
}); });
it('should change user language and update preferences', async () => { it('should change user language and update preferences', async () => {
const userLanguage = 'es'; const userLanguage = 'es';
await vm.saveLanguage(userLanguage); await vm.saveLanguage(userLanguage);
expect(axios.patch).toHaveBeenCalledWith('/VnUsers/115', { lang: userLanguage }); expect(axios.patch).toHaveBeenCalledWith('/VnUsers/115', { lang: userLanguage });
expect(vm.user.lang).toBe(userLanguage); expect(vm.user.lang).toBe(userLanguage);
await vm.updatePreferences(); vm.updatePreferences();
expect(vm.locale).toBe(userLanguage); expect(vm.locale).toBe(userLanguage);
}); });
it('should update user data', async () => { it('should update user data', async () => {
const key = 'name'; const key = 'name';
const value = 'itboss'; const value = 'itboss';
await vm.saveUserData(key, value); await vm.saveUserData(key, value);
expect(axios.post).toHaveBeenCalledWith('UserConfigs/setUserConfig', { [key]: value }); expect(axios.post).toHaveBeenCalledWith('UserConfigs/setUserConfig', {
}); [key]: value,
}); });
});
});

View File

@ -20,12 +20,12 @@ const autofillBic = async (iban) => {
if (ibanCountry != 'ES') return; if (ibanCountry != 'ES') return;
const filter = { where: { id: bankEntityId.value } }; const filter = { where: { id: bankEntityId } };
const params = { filter: JSON.stringify(filter) }; const params = { filter: JSON.stringify(filter) };
const { data } = await axios.get(`BankEntities`, { params }); const { data } = await axios.get(`BankEntities`, { params });
emit('updateBic', data[0].id); emit('updateBic', data[0]?.id);
}; };
</script> </script>
<template> <template>

View File

@ -6,6 +6,7 @@ import { useSummaryDialog } from 'src/composables/useSummaryDialog';
import { useRoute, useRouter } from 'vue-router'; import { useRoute, useRouter } from 'vue-router';
import { useClipboard } from 'src/composables/useClipboard'; import { useClipboard } from 'src/composables/useClipboard';
import VnMoreOptions from './VnMoreOptions.vue'; import VnMoreOptions from './VnMoreOptions.vue';
import { getValueFromPath } from 'src/composables/getValueFromPath';
const entity = defineModel({ type: Object, default: null }); const entity = defineModel({ type: Object, default: null });
const $props = defineProps({ const $props = defineProps({
@ -56,18 +57,6 @@ const routeName = computed(() => {
return `${routeName}Summary`; return `${routeName}Summary`;
}); });
function getValueFromPath(path) {
if (!path) return;
const keys = path.toString().split('.');
let current = entity.value;
for (const key of keys) {
if (current[key] === undefined) return undefined;
else current = current[key];
}
return current;
}
function copyIdText(id) { function copyIdText(id) {
copyText(id, { copyText(id, {
component: { component: {
@ -170,10 +159,10 @@ const toModule = computed(() => {
<div class="title"> <div class="title">
<span <span
v-if="title" v-if="title"
:title="getValueFromPath(title)" :title="getValueFromPath(entity, title)"
:data-cy="`${$attrs['data-cy'] ?? 'vnDescriptor'}_title`" :data-cy="`${$attrs['data-cy'] ?? 'vnDescriptor'}_title`"
> >
{{ getValueFromPath(title) ?? title }} {{ getValueFromPath(entity, title) ?? title }}
</span> </span>
<slot v-else name="description" :entity="entity"> <slot v-else name="description" :entity="entity">
<span <span
@ -189,7 +178,7 @@ const toModule = computed(() => {
class="subtitle" class="subtitle"
:data-cy="`${$attrs['data-cy'] ?? 'vnDescriptor'}_subtitle`" :data-cy="`${$attrs['data-cy'] ?? 'vnDescriptor'}_subtitle`"
> >
#{{ getValueFromPath(subtitle) ?? entity.id }} #{{ getValueFromPath(entity, subtitle) ?? entity.id }}
</QItemLabel> </QItemLabel>
<QBtn <QBtn
round round

View File

@ -1,60 +0,0 @@
<script setup>
import { ref } from 'vue';
import { useI18n } from 'vue-i18n';
const { t } = useI18n();
const props = defineProps({
usesMana: {
type: Boolean,
required: true,
},
manaCode: {
type: String,
required: true,
},
manaVal: {
type: String,
default: 'mana',
},
manaLabel: {
type: String,
default: 'Promotion mana',
},
manaClaimVal: {
type: String,
default: 'manaClaim',
},
claimLabel: {
type: String,
default: 'Claim mana',
},
});
const manaCode = ref(props.manaCode);
</script>
<template>
<div class="column q-gutter-y-sm q-mt-sm">
<QRadio
v-model="manaCode"
dense
:val="manaVal"
:label="t(manaLabel)"
:dark="true"
class="q-mb-sm"
/>
<QRadio
v-model="manaCode"
dense
:val="manaClaimVal"
:label="t(claimLabel)"
:dark="true"
class="q-mb-sm"
/>
</div>
</template>
<i18n>
es:
Promotion mana: Maná promoción
Claim mana: Maná reclamación
</i18n>

View File

@ -0,0 +1,11 @@
export function getValueFromPath(root, path) {
if (!root || !path) return;
const keys = path.toString().split('.');
let current = root;
for (const key of keys) {
if (current[key] === undefined) return undefined;
else current = current[key];
}
return current;
}

View File

@ -18,6 +18,7 @@ $positive: #c8e484;
$negative: #fb5252; $negative: #fb5252;
$info: #84d0e2; $info: #84d0e2;
$warning: #f4b974; $warning: #f4b974;
$neutral: #b0b0b0;
// Pendiente de cuadrar con la base de datos // Pendiente de cuadrar con la base de datos
$success: $positive; $success: $positive;
$alert: $negative; $alert: $negative;
@ -51,3 +52,6 @@ $width-xl: 1600px;
.bg-alert { .bg-alert {
background-color: $negative; background-color: $negative;
} }
.bg-neutral {
background-color: $neutral;
}

View File

@ -28,14 +28,8 @@ const entityId = computed(() => {
return $props.id || route.params.id; return $props.id || route.params.id;
}); });
const STATE_COLOR = { function stateColor(entity) {
pending: 'warning', return entity?.claimState?.classColor;
incomplete: 'info',
resolved: 'positive',
canceled: 'negative',
};
function stateColor(code) {
return STATE_COLOR[code];
} }
onMounted(async () => { onMounted(async () => {
@ -57,9 +51,8 @@ onMounted(async () => {
<VnLv v-if="entity.claimState" :label="t('claim.state')"> <VnLv v-if="entity.claimState" :label="t('claim.state')">
<template #value> <template #value>
<QBadge <QBadge
:color="stateColor(entity.claimState.code)" :color="stateColor(entity)"
text-color="black" style="color: var(--vn-black-text-color)"
dense
> >
{{ entity.claimState.description }} {{ entity.claimState.description }}
</QBadge> </QBadge>

View File

@ -108,15 +108,9 @@ const markerLabels = [
{ value: 5, label: t('claim.person') }, { value: 5, label: t('claim.person') },
]; ];
const STATE_COLOR = {
pending: 'warning',
incomplete: 'info',
resolved: 'positive',
canceled: 'negative',
};
function stateColor(code) { function stateColor(code) {
return STATE_COLOR[code]; const claimState = claimStates.value.find((state) => state.code === code);
return claimState?.classColor;
} }
const developmentColumns = ref([ const developmentColumns = ref([
@ -188,7 +182,7 @@ function claimUrl(section) {
<template> <template>
<FetchData <FetchData
url="ClaimStates" url="ClaimStates"
:filter="{ fields: ['id', 'description'] }" :filter="{ fields: ['id', 'description', 'code', 'classColor'] }"
@on-fetch="(data) => (claimStates = data)" @on-fetch="(data) => (claimStates = data)"
auto-load auto-load
/> />
@ -346,17 +340,18 @@ function claimUrl(section) {
<template #body="props"> <template #body="props">
<QTr :props="props"> <QTr :props="props">
<QTd v-for="col in props.cols" :key="col.name" :props="props"> <QTd v-for="col in props.cols" :key="col.name" :props="props">
<span v-if="col.name != 'description'">{{ <template v-if="col.name === 'description'">
t(col.value) <span class="link">{{
}}</span> dashIfEmpty(col.field(props.row))
<span class="link" v-if="col.name === 'description'">{{ }}</span>
t(col.value) <ItemDescriptorProxy
}}</span> :id="props.row.sale.itemFk"
<ItemDescriptorProxy :sale-fk="props.row.saleFk"
v-if="col.name == 'description'" />
:id="props.row.sale.itemFk" </template>
:sale-fk="props.row.saleFk" <template v-else>
></ItemDescriptorProxy> {{ dashIfEmpty(col.field(props.row)) }}
</template>
</QTd> </QTd>
</QTr> </QTr>
</template> </template>

View File

@ -101,7 +101,10 @@ const columns = computed(() => [
name: 'stateCode', name: 'stateCode',
chip: { chip: {
condition: () => true, condition: () => true,
color: ({ stateCode }) => STATE_COLOR[stateCode] ?? 'bg-grey', color: ({ stateCode }) => {
const state = states.value?.find(({ code }) => code === stateCode);
return `bg-${state.classColor}`;
},
}, },
columnFilter: { columnFilter: {
name: 'claimStateFk', name: 'claimStateFk',
@ -131,12 +134,6 @@ const columns = computed(() => [
], ],
}, },
]); ]);
const STATE_COLOR = {
pending: 'bg-warning',
loses: 'bg-negative',
resolved: 'bg-positive',
};
</script> </script>
<template> <template>

View File

@ -185,7 +185,7 @@ const sumRisk = ({ clientRisks }) => {
/> />
<VnLv <VnLv
:label="t('customer.summary.payMethod')" :label="t('customer.summary.payMethod')"
:value="entity.payMethod.name" :value="entity.payMethod?.name"
/> />
<VnLv :label="t('customer.summary.bankAccount')" :value="entity.iban" /> <VnLv :label="t('customer.summary.bankAccount')" :value="entity.iban" />
<VnLv :label="t('customer.summary.dueDay')" :value="entity.dueDay" /> <VnLv :label="t('customer.summary.dueDay')" :value="entity.dueDay" />

View File

@ -46,7 +46,7 @@ async function getClaims() {
originalTicket.value = data[0]?.originalTicketFk; originalTicket.value = data[0]?.originalTicketFk;
} }
async function getProblems() { async function getProblems() {
const { data } = await axios.get(`Tickets/${entityId.value}/getTicketProblems`); const { data } = await axios.get(`Tickets/getTicketProblems`, {params: { ids: [entityId.value] }});
if (!data) return; if (!data) return;
problems.value = data[0]; problems.value = data[0];
} }

View File

@ -4,7 +4,6 @@ import { useI18n } from 'vue-i18n';
import { computed, ref } from 'vue'; import { computed, ref } from 'vue';
import { useRoute } from 'vue-router'; import { useRoute } from 'vue-router';
import { toCurrency } from 'src/filters'; import { toCurrency } from 'src/filters';
import VnUsesMana from 'components/ui/VnUsesMana.vue';
const $props = defineProps({ const $props = defineProps({
newPrice: { newPrice: {
@ -15,23 +14,36 @@ const $props = defineProps({
type: Object, type: Object,
default: null, default: null,
}, },
componentId: {
type: Number,
default: null,
},
}); });
const emit = defineEmits(['save', 'cancel', 'update:componentId']);
const route = useRoute(); const route = useRoute();
const mana = ref(null); const mana = ref(null);
const usesMana = ref(false); const usesMana = ref([]);
const emit = defineEmits(['save', 'cancel']);
const { t } = useI18n(); const { t } = useI18n();
const QPopupProxyRef = ref(null); const QPopupProxyRef = ref(null);
const manaCode = ref($props.manaCode);
const componentId = computed({
get: () => $props.componentId,
set: (val) => emit('update:componentId', val),
});
const save = (sale = $props.sale) => { const save = (sale = $props.sale) => {
emit('save', sale); emit('save', sale);
QPopupProxyRef.value.hide(); QPopupProxyRef.value.hide();
}; };
const cancel = () => {
emit('cancel');
QPopupProxyRef.value.hide();
};
const getMana = async () => { const getMana = async () => {
const { data } = await axios.get(`Tickets/${route.params.id}/getDepartmentMana`); const { data } = await axios.get(`Tickets/${route.params.id}/getDepartmentMana`);
mana.value = data; mana.value = data;
@ -39,15 +51,12 @@ const getMana = async () => {
}; };
const getUsesMana = async () => { const getUsesMana = async () => {
const { data } = await axios.get('Sales/usesMana'); const { data } = await axios.get('Sales/getComponents');
usesMana.value = data; usesMana.value = data;
}; };
const cancel = () => {
emit('cancel');
QPopupProxyRef.value.hide();
};
const hasMana = computed(() => typeof mana.value === 'number'); const hasMana = computed(() => typeof mana.value === 'number');
defineExpose({ save }); defineExpose({ save });
</script> </script>
@ -59,17 +68,29 @@ defineExpose({ save });
> >
<div class="container"> <div class="container">
<div class="header">Mana: {{ toCurrency(mana) }}</div> <div class="header">Mana: {{ toCurrency(mana) }}</div>
<QSpinner v-if="!hasMana" color="primary" size="md" />
<QSpinner v-if="!usesMana.length" color="primary" />
<div class="q-pa-md" v-else> <div class="q-pa-md" v-else>
<slot :popup="QPopupProxyRef" /> <slot :popup="QPopupProxyRef" />
<div v-if="usesMana" class="column q-gutter-y-sm q-mt-sm">
<VnUsesMana :mana-code="manaCode" /> <div v-if="usesMana.length" class="column q-gutter-y-sm q-mt-sm">
<QRadio
v-for="(item, index) in usesMana"
:key="index"
v-model="componentId"
:val="item.id"
:label="item.name"
dense
:dark="true"
class="q-mb-sm"
:data-cy="`componentOption-${item.id}`"
/>
</div> </div>
<div v-if="newPrice" class="column items-center q-mt-lg"> <div v-if="newPrice" class="column items-center q-mt-lg">
<span class="text-primary">{{ t('New price') }}</span> <span class="text-primary">{{ t('New price') }}</span>
<span class="text-subtitle1"> <span class="text-subtitle1">{{ toCurrency(newPrice) }}</span>
{{ toCurrency($props.newPrice) }}
</span>
</div> </div>
</div> </div>
@ -77,7 +98,6 @@ defineExpose({ save });
<QBtn <QBtn
color="primary" color="primary"
class="no-border-radius" class="no-border-radius"
dense
style="width: 50%" style="width: 50%"
@click="cancel()" @click="cancel()"
> >
@ -86,7 +106,6 @@ defineExpose({ save });
<QBtn <QBtn
color="primary" color="primary"
class="no-border-radius" class="no-border-radius"
dense
style="width: 50%" style="width: 50%"
@click="save()" @click="save()"
data-cy="saveManaBtn" data-cy="saveManaBtn"
@ -116,8 +135,3 @@ defineExpose({ save });
min-width: 230px; min-width: 230px;
} }
</style> </style>
<i18n>
es:
New price: Nuevo precio
</i18n>

View File

@ -45,7 +45,7 @@ const isTicketEditable = ref(false);
const sales = ref([]); const sales = ref([]);
const editableStatesOptions = ref([]); const editableStatesOptions = ref([]);
const selectedSales = ref([]); const selectedSales = ref([]);
const manaCode = ref('mana'); const componentId = ref(null);
const ticketState = computed(() => store.data?.ticketState?.state?.code); const ticketState = computed(() => store.data?.ticketState?.state?.code);
const transfer = ref({ const transfer = ref({
lastActiveTickets: [], lastActiveTickets: [],
@ -187,7 +187,7 @@ const getRowUpdateInputEvents = (sale) => {
}; };
const resetChanges = async () => { const resetChanges = async () => {
arrayData.fetch({ append: false }); await arrayData.fetch({ append: false });
tableRef.value.CrudModelRef.hasChanges = false; tableRef.value.CrudModelRef.hasChanges = false;
await tableRef.value.reload(); await tableRef.value.reload();
@ -308,14 +308,15 @@ const changePrice = async (sale) => {
if (newPrice != null && newPrice != sale.price) { if (newPrice != null && newPrice != sale.price) {
if (await isSalePrepared(sale)) { if (await isSalePrepared(sale)) {
await confirmUpdate(() => updatePrice(sale, newPrice)); await confirmUpdate(() => updatePrice(sale, newPrice));
} else updatePrice(sale, newPrice); } else await updatePrice(sale, newPrice);
} }
}; };
const updatePrice = async (sale, newPrice) => { const updatePrice = async (sale, newPrice) => {
try { try {
await axios.post(`Sales/${sale.id}/updatePrice`, { newPrice }); await axios.post(`Sales/${sale.id}/updatePrice`, {
sale.price = newPrice; newPrice: newPrice,
edit.value = { ...DEFAULT_EDIT }; componentId: componentId.value,
});
notify('globals.dataSaved', 'positive'); notify('globals.dataSaved', 'positive');
resetChanges(); resetChanges();
} catch (e) { } catch (e) {
@ -327,28 +328,31 @@ const changeDiscount = async (sale) => {
const newDiscount = edit.value.discount; const newDiscount = edit.value.discount;
if (newDiscount != null && newDiscount != sale.discount) { if (newDiscount != null && newDiscount != sale.discount) {
if (await isSalePrepared(sale)) if (await isSalePrepared(sale))
await confirmUpdate(() => updateDiscount([sale], newDiscount)); await confirmUpdate(() =>
else await updateDiscount([sale], newDiscount); updateDiscount([sale], newDiscount, componentId.value),
);
else await updateDiscount([sale], newDiscount, componentId.value);
} }
}; };
const updateDiscounts = async (sales, newDiscount) => { const updateDiscounts = async (sales, newDiscount, componentId) => {
const salesTracking = await fetchSalesTracking(); const salesTracking = await fetchSalesTracking();
const someSaleIsPrepared = salesTracking.some((sale) => const someSaleIsPrepared = salesTracking.some((sale) =>
matchSale(salesTracking, sale), matchSale(salesTracking, sale),
); );
if (someSaleIsPrepared) await confirmUpdate(() => updateDiscount(sales, newDiscount)); if (someSaleIsPrepared)
else updateDiscount(sales, newDiscount); await confirmUpdate(() => updateDiscount(sales, newDiscount, componentId));
else updateDiscount(sales, newDiscount, componentId);
}; };
const updateDiscount = async (sales, newDiscount = 0) => { const updateDiscount = async (sales, newDiscount, componentId) => {
try { try {
const salesIds = sales.map(({ id }) => id); const salesIds = sales.map(({ id }) => id);
const params = { const params = {
salesIds, salesIds,
newDiscount, newDiscount: newDiscount ?? 0,
manaCode: manaCode.value, componentId,
}; };
await axios.post(`Tickets/${route.params.id}/updateDiscount`, params); await axios.post(`Tickets/${route.params.id}/updateDiscount`, params);
notify('globals.dataSaved', 'positive'); notify('globals.dataSaved', 'positive');
@ -821,10 +825,11 @@ watch(
ref="editPriceProxyRef" ref="editPriceProxyRef"
:sale="row" :sale="row"
:new-price="getNewPrice" :new-price="getNewPrice"
v-model:component-id="componentId"
@save="changePrice" @save="changePrice"
> >
<VnInput <VnInput
@keyup.enter.stop="() => editManaProxyRef.save(row)" @keyup.enter.stop="() => editPriceProxyRef.save(row)"
v-model.number="edit.price" v-model.number="edit.price"
:label="t('basicData.price')" :label="t('basicData.price')"
type="number" type="number"
@ -843,7 +848,7 @@ watch(
ref="editManaProxyRef" ref="editManaProxyRef"
:sale="row" :sale="row"
:new-price="getNewPrice" :new-price="getNewPrice"
:mana-code="manaCode" v-model:component-id="componentId"
@save="changeDiscount" @save="changeDiscount"
> >
<VnInput <VnInput

View File

@ -47,6 +47,7 @@ const { notify } = useNotify();
const acl = useAcl(); const acl = useAcl();
const btnDropdownRef = ref(null); const btnDropdownRef = ref(null);
const editManaProxyRef = ref(null); const editManaProxyRef = ref(null);
const componentId = ref(null);
const { openConfirmationModal } = useVnConfirm(); const { openConfirmationModal } = useVnConfirm();
const newDiscount = ref(null); const newDiscount = ref(null);
@ -112,7 +113,7 @@ const changeMultipleDiscount = () => {
}); });
if (newDiscount.value != null && hasChanges) if (newDiscount.value != null && hasChanges)
emit('updateDiscounts', props.sales, newDiscount.value); emit('updateDiscounts', props.sales, newDiscount.value, componentId.value);
btnDropdownRef.value.hide(); btnDropdownRef.value.hide();
}; };
@ -206,6 +207,7 @@ const createRefund = async (withWarehouse) => {
ref="editManaProxyRef" ref="editManaProxyRef"
:sale="row" :sale="row"
@save="changeMultipleDiscount" @save="changeMultipleDiscount"
v-model:component-id="componentId"
> >
<VnInput <VnInput
autofocus autofocus

View File

@ -14,6 +14,8 @@ import { useState } from 'src/composables/useState';
import { toDateFormat } from 'src/filters/date.js'; import { toDateFormat } from 'src/filters/date.js';
import axios from 'axios'; import axios from 'axios';
import VnTable from 'src/components/VnTable/VnTable.vue'; import VnTable from 'src/components/VnTable/VnTable.vue';
import { QTable } from 'quasar';
import TicketProblems from 'src/components/TicketProblems.vue';
const state = useState(); const state = useState();
const { t } = useI18n(); const { t } = useI18n();
@ -27,6 +29,16 @@ const selectedTickets = ref([]);
const vnTableRef = ref({}); const vnTableRef = ref({});
const originElRef = ref(null); const originElRef = ref(null);
const destinationElRef = ref(null); const destinationElRef = ref(null);
const actions = {
advance: {
title: t('advanceTickets.advanceTickets'),
cb: moveTicketsAdvance,
},
advanceWithoutNegative: {
title: t('advanceTickets.advanceTicketsWithoutNegatives'),
cb: splitTickets,
},
};
let today = Date.vnNew().toISOString(); let today = Date.vnNew().toISOString();
const tomorrow = new Date(today); const tomorrow = new Date(today);
tomorrow.setDate(tomorrow.getDate() + 1); tomorrow.setDate(tomorrow.getDate() + 1);
@ -78,6 +90,15 @@ const ticketColumns = computed(() => [
headerClass: 'horizontal-separator', headerClass: 'horizontal-separator',
hidden: true, hidden: true,
}, },
{
label: t('globals.agency'),
name: 'agency',
field: 'agency',
align: 'left',
sortable: true,
headerClass: 'horizontal-separator',
columnFilter: false,
},
{ {
label: t('advanceTickets.preparation'), label: t('advanceTickets.preparation'),
name: 'preparation', name: 'preparation',
@ -85,7 +106,6 @@ const ticketColumns = computed(() => [
align: 'left', align: 'left',
sortable: true, sortable: true,
headerClass: 'horizontal-separator', headerClass: 'horizontal-separator',
columnFilter: false,
}, },
{ {
align: 'left', align: 'left',
@ -110,10 +130,17 @@ const ticketColumns = computed(() => [
}, },
{ {
align: 'left', align: 'left',
label: t('advanceTickets.futureId'), label: '',
name: 'futureId', name: 'problems',
headerClass: 'vertical-separator horizontal-separator', headerClass: 'vertical-separator horizontal-separator',
columnClass: 'vertical-separator', columnClass: 'vertical-separator',
hidden: true,
},
{
align: 'left',
label: t('advanceTickets.futureId'),
name: 'futureId',
headerClass: 'horizontal-separator',
}, },
{ {
align: 'left', align: 'left',
@ -242,7 +269,7 @@ const requestComponentUpdate = async (ticket, isWithoutNegatives) => {
return { query, params }; return { query, params };
}; };
const moveTicketsAdvance = async () => { async function moveTicketsAdvance() {
let ticketsToMove = []; let ticketsToMove = [];
for (const ticket of selectedTickets.value) { for (const ticket of selectedTickets.value) {
if (!ticket.id) { if (!ticket.id) {
@ -267,7 +294,7 @@ const moveTicketsAdvance = async () => {
vnTableRef.value.reload(); vnTableRef.value.reload();
selectedTickets.value = []; selectedTickets.value = [];
if (ticketsToMove.length) notify(t('advanceTickets.moveTicketSuccess'), 'positive'); if (ticketsToMove.length) notify(t('advanceTickets.moveTicketSuccess'), 'positive');
}; }
const progressLength = ref(0); const progressLength = ref(0);
const progressPercentage = computed(() => { const progressPercentage = computed(() => {
@ -290,7 +317,7 @@ const progressAdd = () => {
} }
}; };
const splitTickets = async () => { async function splitTickets() {
try { try {
showProgressDialog.value = true; showProgressDialog.value = true;
for (const ticket of selectedTickets.value) { for (const ticket of selectedTickets.value) {
@ -310,7 +337,7 @@ const splitTickets = async () => {
} finally { } finally {
vnTableRef.value.reload(); vnTableRef.value.reload();
} }
}; }
const resetProgressData = () => { const resetProgressData = () => {
if (cancelProgress.value) cancelProgress.value = false; if (cancelProgress.value) cancelProgress.value = false;
@ -326,6 +353,32 @@ const handleCloseProgressDialog = () => {
const handleCancelProgress = () => (cancelProgress.value = true); const handleCancelProgress = () => (cancelProgress.value = true);
const confirmAction = (action) => {
openConfirmationModal(actions[action].title, false, actions[action].cb, null, {
component: QTable,
props: {
columns: [
{
align: 'left',
label: t('advanceTickets.destination'),
name: 'id',
field: (row) => row.id,
},
{
align: 'left',
label: t('advanceTickets.origin'),
name: 'futureId',
field: (row) => row.futureId,
},
],
rows: selectedTickets.value,
class: 'full-width',
dense: true,
flat: true,
},
});
};
watch( watch(
() => vnTableRef.value.tableRef?.$el, () => vnTableRef.value.tableRef?.$el,
($el) => { ($el) => {
@ -399,15 +452,7 @@ watch(
color="primary" color="primary"
class="q-mr-sm" class="q-mr-sm"
:disable="!selectedTickets.length" :disable="!selectedTickets.length"
@click.stop=" @click.stop="confirmAction('advance')"
openConfirmationModal(
t('advanceTickets.advanceTicketTitle'),
t(`advanceTickets.advanceTitleSubtitle`, {
selectedTickets: selectedTickets.length,
}),
moveTicketsAdvance,
)
"
> >
<QTooltip> <QTooltip>
{{ t('advanceTickets.advanceTickets') }} {{ t('advanceTickets.advanceTickets') }}
@ -417,15 +462,7 @@ watch(
icon="alt_route" icon="alt_route"
color="primary" color="primary"
:disable="!selectedTickets.length" :disable="!selectedTickets.length"
@click.stop=" @click.stop="confirmAction('advanceWithoutNegative')"
openConfirmationModal(
t('advanceTickets.advanceWithoutNegativeTitle'),
t(`advanceTickets.advanceWithoutNegativeSubtitle`, {
selectedTickets: selectedTickets.length,
}),
splitTickets,
)
"
> >
<QTooltip> <QTooltip>
{{ t('advanceTickets.advanceTicketsWithoutNegatives') }} {{ t('advanceTickets.advanceTicketsWithoutNegatives') }}
@ -454,9 +491,9 @@ watch(
}" }"
v-model:selected="selectedTickets" v-model:selected="selectedTickets"
:pagination="{ rowsPerPage: 0 }" :pagination="{ rowsPerPage: 0 }"
:no-data-label="t('globals.noResults')" :no-data-label="$t('globals.noResults')"
:right-search="false" :right-search="false"
:order="['futureTotalWithVat ASC']" :order="['futureTotalWithVat ASC']"
auto-load auto-load
:disable-option="{ card: true }" :disable-option="{ card: true }"
> >
@ -522,6 +559,9 @@ watch(
{{ toCurrency(row.totalWithVat || 0) }} {{ toCurrency(row.totalWithVat || 0) }}
</QBadge> </QBadge>
</template> </template>
<template #column-problems="{ row }">
<TicketProblems :row="row.problems" :visible-problems="['hasRisk']" />
</template>
<template #column-futureId="{ row }"> <template #column-futureId="{ row }">
<QBtn flat class="link" dense> <QBtn flat class="link" dense>
{{ row.futureId }} {{ row.futureId }}

View File

@ -10,7 +10,7 @@ import VnInputDate from 'src/components/common/VnInputDate.vue';
import axios from 'axios'; import axios from 'axios';
import { onMounted } from 'vue'; import { onMounted } from 'vue';
import VnInputNumber from 'src/components/common/VnInputNumber.vue'; import VnInputNumber from 'src/components/common/VnInputNumber.vue';
import VnCheckbox from 'src/components/common/VnCheckbox.vue';
const { t, te } = useI18n(); const { t, te } = useI18n();
const props = defineProps({ const props = defineProps({
dataKey: { dataKey: {
@ -122,18 +122,20 @@ onMounted(async () => await getItemPackingTypes());
<QItemSection> <QItemSection>
<VnInputNumber <VnInputNumber
v-model="params.scopeDays" v-model="params.scopeDays"
:label="t('Days onward')" :label="t('globals.daysOnward')"
filled filled
:step="0"
/> />
</QItemSection> </QItemSection>
</QItem> </QItem>
<QItem> <QItem>
<QItemSection> <QItemSection>
<QCheckbox <VnCheckbox
:label="t('params.isFullMovable')" :label="t('params.isFullMovable')"
v-model="params.isFullMovable" v-model="params.isFullMovable"
toggle-indeterminate toggle-indeterminate
@update:model-value="searchFn()" @update:model-value="searchFn()"
dense
/> />
</QItemSection> </QItemSection>
</QItem> </QItem>
@ -166,11 +168,12 @@ onMounted(async () => await getItemPackingTypes());
</QItem> </QItem>
<QItem> <QItem>
<QItemSection> <QItemSection>
<QCheckbox <VnCheckbox
toggle-indeterminate toggle-indeterminate
label="only with destination" :label="t('params.onlyWithDestination')"
v-model="params.onlyWithDestination" v-model="params.onlyWithDestination"
@update:model-value="searchFn()" @update:model-value="searchFn()"
dense
/> />
</QItemSection> </QItemSection>
</QItem> </QItem>
@ -194,8 +197,8 @@ es:
Vertical: Vertical Vertical: Vertical
iptInfo: Encajado iptInfo: Encajado
params: params:
dateFuture: fecha origen dateFuture: F. origen
dateToAdvance: Fecha destino dateToAdvance: F. destino
futureIpt: IPT Origen futureIpt: IPT Origen
ipt: IPT destino ipt: IPT destino
isFullMovable: 100% movible isFullMovable: 100% movible

View File

@ -113,7 +113,7 @@ const ticketCard = {
name: 'TicketExpedition', name: 'TicketExpedition',
meta: { meta: {
title: 'expedition', title: 'expedition',
icon: 'vn:package', icon: 'view_in_ar',
}, },
component: () => import('src/pages/Ticket/Card/TicketExpedition.vue'), component: () => import('src/pages/Ticket/Card/TicketExpedition.vue'),
}, },
@ -168,7 +168,7 @@ const ticketCard = {
name: 'TicketBoxing', name: 'TicketBoxing',
meta: { meta: {
title: 'boxing', title: 'boxing',
icon: 'view_in_ar', icon: 'videocam',
}, },
component: () => import('src/pages/Ticket/Card/TicketBoxing.vue'), component: () => import('src/pages/Ticket/Card/TicketBoxing.vue'),
}, },

View File

@ -6,7 +6,6 @@ describe.skip('ClaimAction', () => {
const destinationRow = '.q-item__section > .q-field'; const destinationRow = '.q-item__section > .q-field';
beforeEach(() => { beforeEach(() => {
cy.viewport(1920, 1080);
cy.login('developer'); cy.login('developer');
cy.visit(`/#/claim/${claimId}/action`); cy.visit(`/#/claim/${claimId}/action`);
}); });

View File

@ -7,7 +7,6 @@ describe.skip('ClaimDevelopment', () => {
const newReason = 'Calor'; const newReason = 'Calor';
beforeEach(() => { beforeEach(() => {
cy.viewport(1920, 1080);
cy.login('developer'); cy.login('developer');
cy.visit(`/#/claim/${claimId}/development`); cy.visit(`/#/claim/${claimId}/development`);
cy.waitForElement('tbody'); cy.waitForElement('tbody');

View File

@ -2,7 +2,6 @@ import '../commands.js';
describe('EntryBasicData', () => { describe('EntryBasicData', () => {
beforeEach(() => { beforeEach(() => {
cy.viewport(1920, 1080);
cy.login('buyer'); cy.login('buyer');
cy.visit(`/#/entry/list`); cy.visit(`/#/entry/list`);
}); });

View File

@ -1,7 +1,6 @@
import '../commands.js'; import '../commands.js';
describe('EntryDescriptor', () => { describe('EntryDescriptor', () => {
beforeEach(() => { beforeEach(() => {
cy.viewport(1920, 1080);
cy.login('buyer'); cy.login('buyer');
cy.visit(`/#/entry/list`); cy.visit(`/#/entry/list`);
}); });

View File

@ -1,7 +1,6 @@
import '../commands.js'; import '../commands.js';
describe('EntryDms', () => { describe('EntryDms', () => {
beforeEach(() => { beforeEach(() => {
cy.viewport(1920, 1080);
cy.login('buyer'); cy.login('buyer');
cy.visit(`/#/entry/list`); cy.visit(`/#/entry/list`);
}); });

View File

@ -1,7 +1,6 @@
import '../commands.js'; import '../commands.js';
describe('EntryLock', () => { describe('EntryLock', () => {
beforeEach(() => { beforeEach(() => {
cy.viewport(1920, 1080);
cy.login('buyer'); cy.login('buyer');
cy.visit(`/#/entry/list`); cy.visit(`/#/entry/list`);
}); });

View File

@ -2,7 +2,6 @@ import '../commands.js';
describe('EntryNotes', () => { describe('EntryNotes', () => {
beforeEach(() => { beforeEach(() => {
cy.viewport(1920, 1080);
cy.login('buyer'); cy.login('buyer');
cy.visit(`/#/entry/list`); cy.visit(`/#/entry/list`);
}); });

View File

@ -2,7 +2,6 @@ import './commands';
describe('EntryList', () => { describe('EntryList', () => {
beforeEach(() => { beforeEach(() => {
cy.viewport(1920, 1080);
cy.login('buyer'); cy.login('buyer');
cy.visit(`/#/entry/list`); cy.visit(`/#/entry/list`);
}); });

View File

@ -1,6 +1,5 @@
describe('EntryStockBought', () => { describe('EntryStockBought', () => {
beforeEach(() => { beforeEach(() => {
cy.viewport(1920, 1080);
cy.login('buyer'); cy.login('buyer');
cy.visit(`/#/entry/stock-Bought`); cy.visit(`/#/entry/stock-Bought`);
}); });

View File

@ -1,6 +1,5 @@
describe('EntrySupplier when is supplier', () => { describe('EntrySupplier when is supplier', () => {
beforeEach(() => { beforeEach(() => {
cy.viewport(1920, 1080);
cy.login('supplier'); cy.login('supplier');
cy.visit(`/#/entry/my`, { cy.visit(`/#/entry/my`, {
onBeforeLoad(win) { onBeforeLoad(win) {

View File

@ -1,7 +1,6 @@
import './commands'; import './commands';
describe('EntryDms', () => { describe('EntryDms', () => {
beforeEach(() => { beforeEach(() => {
cy.viewport(1920, 1080);
cy.login('buyerBoss'); cy.login('buyerBoss');
cy.visit(`/#/entry/waste-recalc`); cy.visit(`/#/entry/waste-recalc`);
}); });

View File

@ -1,7 +1,6 @@
/// <reference types="cypress" /> /// <reference types="cypress" />
describe.skip('InvoiceOut manual invoice', () => { describe.skip('InvoiceOut manual invoice', () => {
beforeEach(() => { beforeEach(() => {
cy.viewport(1920, 1080);
cy.login('developer'); cy.login('developer');
cy.visit(`/#/ticket/list`); cy.visit(`/#/ticket/list`);
cy.get('#searchbar input').type('{enter}'); cy.get('#searchbar input').type('{enter}');

View File

@ -4,7 +4,6 @@ describe('InvoiceOut negative bases', () => {
`:nth-child(1) > [data-col-field="${opt}"] > .no-padding > .link`; `:nth-child(1) > [data-col-field="${opt}"] > .no-padding > .link`;
beforeEach(() => { beforeEach(() => {
cy.viewport(1920, 1080);
cy.login('developer'); cy.login('developer');
cy.visit(`/#/invoice-out/negative-bases`); cy.visit(`/#/invoice-out/negative-bases`);
}); });

View File

@ -1,7 +1,6 @@
/// <reference types="cypress" /> /// <reference types="cypress" />
describe('InvoiceOut global invoicing', () => { describe('InvoiceOut global invoicing', () => {
beforeEach(() => { beforeEach(() => {
cy.viewport(1920, 1080);
cy.login('administrative'); cy.login('administrative');
cy.visit(`/#/invoice-out/global-invoicing`); cy.visit(`/#/invoice-out/global-invoicing`);
}); });
@ -17,7 +16,7 @@ describe('InvoiceOut global invoicing', () => {
cy.dataCy('InvoiceOutGlobalPrinterSelect').type('printer1'); cy.dataCy('InvoiceOutGlobalPrinterSelect').type('printer1');
cy.get('.q-menu .q-item').contains('printer1').click(); cy.get('.q-menu .q-item').contains('printer1').click();
cy.get( cy.get(
'[label="Invoice date"] > .q-field > .q-field__inner > .q-field__control' '[label="Invoice date"] > .q-field > .q-field__inner > .q-field__control',
).click(); ).click();
cy.get(':nth-child(5) > div > .q-btn > .q-btn__content > .block').click(); cy.get(':nth-child(5) > div > .q-btn > .q-btn__content > .block').click();
cy.get('.q-date__years-content > :nth-child(2) > .q-btn').click(); cy.get('.q-date__years-content > :nth-child(2) > .q-btn').click();

View File

@ -1,7 +1,6 @@
/// <reference types="cypress" /> /// <reference types="cypress" />
describe('ItemBarcodes', () => { describe('ItemBarcodes', () => {
beforeEach(() => { beforeEach(() => {
cy.viewport(1920, 1080);
cy.login('developer'); cy.login('developer');
cy.visit(`/#/item/1/barcode`); cy.visit(`/#/item/1/barcode`);
}); });

View File

@ -1,7 +1,6 @@
/// <reference types="cypress" /> /// <reference types="cypress" />
describe('Item botanical', () => { describe('Item botanical', () => {
beforeEach(() => { beforeEach(() => {
cy.viewport(1920, 1080);
cy.login('developer'); cy.login('developer');
cy.visit(`/#/item/1/botanical`); cy.visit(`/#/item/1/botanical`);
}); });

View File

@ -2,7 +2,6 @@
describe.skip('Item list', () => { describe.skip('Item list', () => {
beforeEach(() => { beforeEach(() => {
cy.viewport(1920, 1080);
cy.login('developer'); cy.login('developer');
cy.visit(`/#/item/list`); cy.visit(`/#/item/list`);
cy.typeSearchbar('{enter}'); cy.typeSearchbar('{enter}');

View File

@ -1,7 +1,6 @@
/// <reference types="cypress" /> /// <reference types="cypress" />
describe('Item summary', () => { describe('Item summary', () => {
beforeEach(() => { beforeEach(() => {
cy.viewport(1920, 1080);
cy.login('developer'); cy.login('developer');
cy.visit(`/#/item/1/summary`); cy.visit(`/#/item/1/summary`);
}); });

View File

@ -1,6 +1,5 @@
describe('Item tag', () => { describe('Item tag', () => {
beforeEach(() => { beforeEach(() => {
cy.viewport(1920, 1080);
cy.login('developer'); cy.login('developer');
cy.visit(`/#/item/1/tags`); cy.visit(`/#/item/1/tags`);
cy.get('.q-page').should('be.visible'); cy.get('.q-page').should('be.visible');

View File

@ -1,7 +1,6 @@
/// <reference types="cypress" /> /// <reference types="cypress" />
describe('Item tax', () => { describe('Item tax', () => {
beforeEach(() => { beforeEach(() => {
cy.viewport(1920, 1080);
cy.login('developer'); cy.login('developer');
cy.visit(`/#/item/1/tax`); cy.visit(`/#/item/1/tax`);
}); });

View File

@ -6,7 +6,6 @@ describe('Item type', () => {
const type = 'Flower'; const type = 'Flower';
beforeEach(() => { beforeEach(() => {
cy.viewport(1920, 1080);
cy.login('developer'); cy.login('developer');
cy.visit(`/#/item/item-type`); cy.visit(`/#/item/item-type`);
}); });

View File

@ -6,7 +6,6 @@ describe('OrderList', () => {
beforeEach(() => { beforeEach(() => {
cy.login('developer'); cy.login('developer');
cy.viewport(1920, 1080);
cy.visit('/#/order/list'); cy.visit('/#/order/list');
}); });

View File

@ -2,7 +2,6 @@ describe('Agency modes', () => {
const name = 'inhouse pickup'; const name = 'inhouse pickup';
beforeEach(() => { beforeEach(() => {
cy.viewport(1920, 1080);
cy.login('developer'); cy.login('developer');
cy.visit(`/#/route/agency/1/modes`); cy.visit(`/#/route/agency/1/modes`);
}); });

View File

@ -13,7 +13,6 @@ describe('AgencyWorkCenter', () => {
}; };
beforeEach(() => { beforeEach(() => {
cy.viewport(1920, 1080);
cy.login('developer'); cy.login('developer');
cy.visit(`/#/route/agency/11/workCenter`); cy.visit(`/#/route/agency/11/workCenter`);
}); });

View File

@ -24,7 +24,6 @@ describe('Cmr list', () => {
}; };
beforeEach(() => { beforeEach(() => {
cy.viewport(1920, 1080);
cy.login('developer'); cy.login('developer');
cy.visit('/#/route/cmr'); cy.visit('/#/route/cmr');
cy.typeSearchbar('{enter}'); cy.typeSearchbar('{enter}');

View File

@ -27,7 +27,6 @@ describe('RoadMap', () => {
const summaryUrl = '/summary'; const summaryUrl = '/summary';
beforeEach(() => { beforeEach(() => {
cy.viewport(1920, 1080);
cy.login('developer'); cy.login('developer');
cy.visit(`/#/route/roadmap`); cy.visit(`/#/route/roadmap`);
cy.typeSearchbar('{enter}'); cy.typeSearchbar('{enter}');

View File

@ -32,7 +32,6 @@ describe.skip('RouteAutonomous', () => {
const dataSaved = 'Data saved'; const dataSaved = 'Data saved';
beforeEach(() => { beforeEach(() => {
cy.viewport(1920, 1080);
cy.login('developer'); cy.login('developer');
cy.visit(`/#/route/agency-term`); cy.visit(`/#/route/agency-term`);
cy.typeSearchbar('{enter}'); cy.typeSearchbar('{enter}');

View File

@ -75,7 +75,6 @@ describe.skip('Route extended list', () => {
} }
beforeEach(() => { beforeEach(() => {
cy.viewport(1920, 1080);
cy.login('developer'); cy.login('developer');
cy.visit(url); cy.visit(url);
cy.typeSearchbar('{enter}'); cy.typeSearchbar('{enter}');

View File

@ -26,8 +26,8 @@ describe('Route', () => {
const summaryUrl = '/summary'; const summaryUrl = '/summary';
beforeEach(() => { beforeEach(() => {
cy.viewport(1920, 1080);
cy.login('developer'); cy.login('developer');
cy.viewport(1920, 1080);
cy.visit(`/#/route/list`); cy.visit(`/#/route/list`);
cy.typeSearchbar('{enter}'); cy.typeSearchbar('{enter}');
}); });

View File

@ -1,6 +1,5 @@
describe('Vehicle', () => { describe('Vehicle', () => {
beforeEach(() => { beforeEach(() => {
cy.viewport(1920, 1080);
cy.login('deliveryAssistant'); cy.login('deliveryAssistant');
cy.visit(`/#/route/vehicle/7/summary`); cy.visit(`/#/route/vehicle/7/summary`);
}); });

View File

@ -21,7 +21,6 @@ describe('Vehicle list', () => {
const summaryUrl = '/summary'; const summaryUrl = '/summary';
beforeEach(() => { beforeEach(() => {
cy.viewport(1920, 1080);
cy.login('developer'); cy.login('developer');
cy.visit(`/#/route/vehicle/list`); cy.visit(`/#/route/vehicle/list`);
cy.typeSearchbar('{enter}'); cy.typeSearchbar('{enter}');

View File

@ -10,7 +10,6 @@ describe('Vehicle Notes', () => {
const newNoteText = 'probando'; const newNoteText = 'probando';
beforeEach(() => { beforeEach(() => {
cy.viewport(1920, 1080);
cy.login('developer'); cy.login('developer');
cy.visit(`/#/route/vehicle/1/notes`); cy.visit(`/#/route/vehicle/1/notes`);
}); });

View File

@ -5,7 +5,6 @@ describe('ParkingList', () => {
const summaryHeader = '.header-link'; const summaryHeader = '.header-link';
beforeEach(() => { beforeEach(() => {
cy.viewport(1920, 1080);
cy.login('developer'); cy.login('developer');
cy.visit(`/#/shelving/parking/list`); cy.visit(`/#/shelving/parking/list`);
}); });

View File

@ -3,7 +3,6 @@ describe('ShelvingList', () => {
const parking = const parking =
'.q-card > :nth-child(1) > .q-select > .q-field__inner > .q-field__control > .q-field__control-container'; '.q-card > :nth-child(1) > .q-select > .q-field__inner > .q-field__control > .q-field__control-container';
beforeEach(() => { beforeEach(() => {
cy.viewport(1920, 1080);
cy.login('developer'); cy.login('developer');
cy.visit(`/#/shelving/1/basic-data`); cy.visit(`/#/shelving/1/basic-data`);
}); });

View File

@ -1,7 +1,6 @@
/// <reference types="cypress" /> /// <reference types="cypress" />
describe('ShelvingList', () => { describe('ShelvingList', () => {
beforeEach(() => { beforeEach(() => {
cy.viewport(1920, 1080);
cy.login('developer'); cy.login('developer');
cy.visit(`/#/shelving/list`); cy.visit(`/#/shelving/list`);
}); });

View File

@ -1,6 +1,5 @@
describe('Supplier Balance', () => { describe('Supplier Balance', () => {
beforeEach(() => { beforeEach(() => {
cy.viewport(1920, 1080);
cy.login('developer'); cy.login('developer');
cy.visit(`/#/supplier/1/balance`); cy.visit(`/#/supplier/1/balance`);
}); });

View File

@ -9,7 +9,6 @@ describe('Ticket descriptor', () => {
const weightValue = '[data-cy="vnLvWeight"]'; const weightValue = '[data-cy="vnLvWeight"]';
beforeEach(() => { beforeEach(() => {
cy.login('developer'); cy.login('developer');
cy.viewport(1920, 1080);
}); });
it('should clone the ticket without warehouse', () => { it('should clone the ticket without warehouse', () => {

View File

@ -5,7 +5,6 @@ describe('Ticket expedtion', () => {
beforeEach(() => { beforeEach(() => {
cy.login('developer'); cy.login('developer');
cy.viewport(1920, 1080);
}); });
it('should change the state', () => { it('should change the state', () => {

View File

@ -2,7 +2,6 @@
describe('TicketFilter', () => { describe('TicketFilter', () => {
beforeEach(() => { beforeEach(() => {
cy.login('developer'); cy.login('developer');
cy.viewport(1920, 1080);
cy.visit('/#/ticket/list'); cy.visit('/#/ticket/list');
}); });

View File

@ -2,7 +2,6 @@
describe('TicketList', () => { describe('TicketList', () => {
beforeEach(() => { beforeEach(() => {
cy.login('developer'); cy.login('developer');
cy.viewport(1920, 1080);
cy.visit('/#/ticket/list', false); cy.visit('/#/ticket/list', false);
}); });

View File

@ -2,7 +2,6 @@
describe('TicketNotes', () => { describe('TicketNotes', () => {
beforeEach(() => { beforeEach(() => {
cy.login('developer'); cy.login('developer');
cy.viewport(1920, 1080);
cy.visit('/#/ticket/31/observation'); cy.visit('/#/ticket/31/observation');
}); });

View File

@ -2,7 +2,6 @@
describe('TicketRequest', () => { describe('TicketRequest', () => {
beforeEach(() => { beforeEach(() => {
cy.login('developer'); cy.login('developer');
cy.viewport(1920, 1080);
cy.visit('/#/ticket/31/request'); cy.visit('/#/ticket/31/request');
}); });

View File

@ -4,7 +4,7 @@ const firstRow = 'tbody > :nth-child(1)';
describe('TicketSale', () => { describe('TicketSale', () => {
describe('#23', () => { describe('#23', () => {
beforeEach(() => { beforeEach(() => {
cy.login('salesBoss'); cy.login('claimManager');
cy.viewport(1920, 1080); cy.viewport(1920, 1080);
cy.visit('/#/ticket/23/sale'); cy.visit('/#/ticket/23/sale');
}); });
@ -15,6 +15,8 @@ describe('TicketSale', () => {
cy.get('[data-col-field="price"]').find('.q-btn').click(); cy.get('[data-col-field="price"]').find('.q-btn').click();
cy.waitForElement('[data-cy="ticketEditManaProxy"]'); cy.waitForElement('[data-cy="ticketEditManaProxy"]');
cy.dataCy('ticketEditManaProxy').should('exist'); cy.dataCy('ticketEditManaProxy').should('exist');
cy.get('[data-cy="componentOption-37"]').click();
cy.waitForElement('[data-cy="Price_input"]'); cy.waitForElement('[data-cy="Price_input"]');
cy.dataCy('Price_input').clear().type(price); cy.dataCy('Price_input').clear().type(price);
cy.intercept('POST', /\/api\/Sales\/\d+\/updatePrice/).as('updatePrice'); cy.intercept('POST', /\/api\/Sales\/\d+\/updatePrice/).as('updatePrice');
@ -33,6 +35,7 @@ describe('TicketSale', () => {
cy.get('[data-col-field="discount"]').find('.q-btn').click(); cy.get('[data-col-field="discount"]').find('.q-btn').click();
cy.waitForElement('[data-cy="ticketEditManaProxy"]'); cy.waitForElement('[data-cy="ticketEditManaProxy"]');
cy.dataCy('ticketEditManaProxy').should('exist'); cy.dataCy('ticketEditManaProxy').should('exist');
cy.get('[data-cy="componentOption-37"]').click();
cy.waitForElement('[data-cy="Disc_input"]'); cy.waitForElement('[data-cy="Disc_input"]');
cy.dataCy('Disc_input').clear().type(discount); cy.dataCy('Disc_input').clear().type(discount);
cy.intercept('POST', /\/api\/Tickets\/\d+\/updateDiscount/).as( cy.intercept('POST', /\/api\/Tickets\/\d+\/updateDiscount/).as(
@ -83,8 +86,7 @@ describe('TicketSale', () => {
}); });
describe('#24 add claim', () => { describe('#24 add claim', () => {
beforeEach(() => { beforeEach(() => {
cy.login('developer'); cy.login('salesPerson');
cy.viewport(1920, 1080);
cy.visit('/#/ticket/24/sale'); cy.visit('/#/ticket/24/sale');
}); });
@ -102,8 +104,7 @@ describe('TicketSale', () => {
}); });
describe('#31 free ticket', () => { describe('#31 free ticket', () => {
beforeEach(() => { beforeEach(() => {
cy.login('developer'); cy.login('claimManager');
cy.viewport(1920, 1080);
cy.visit('/#/ticket/31/sale'); cy.visit('/#/ticket/31/sale');
}); });
@ -139,14 +140,15 @@ describe('TicketSale', () => {
cy.dataCy('ticketSaleMoreActionsDropdown').should('be.disabled'); cy.dataCy('ticketSaleMoreActionsDropdown').should('be.disabled');
}); });
it.only('should update discount when "Update discount" is clicked', () => { it('should update discount when "Update discount" is clicked', () => {
const discount = Number((Math.random() * 99 + 1).toFixed(2)); const discount = Number((Math.random() * 99 + 1).toFixed(2));
selectFirstRow(); selectFirstRow();
cy.dataCy('ticketSaleMoreActionsDropdown').click(); cy.dataCy('ticketSaleMoreActionsDropdown').click();
cy.waitForElement('[data-cy="updateDiscountItem"]'); cy.waitForElement('[data-cy="updateDiscountItem"]');
cy.dataCy('updateDiscountItem').should('exist');
cy.dataCy('updateDiscountItem').click(); cy.dataCy('updateDiscountItem').click();
cy.waitForElement('[data-cy="componentOption-37"]');
cy.get('[data-cy="componentOption-37"]').click();
cy.waitForElement('[data-cy="ticketSaleDiscountInput"]'); cy.waitForElement('[data-cy="ticketSaleDiscountInput"]');
cy.dataCy('ticketSaleDiscountInput').find('input').focus(); cy.dataCy('ticketSaleDiscountInput').find('input').focus();
cy.intercept('POST', /\/api\/Tickets\/\d+\/updateDiscount/).as( cy.intercept('POST', /\/api\/Tickets\/\d+\/updateDiscount/).as(
@ -191,8 +193,7 @@ describe('TicketSale', () => {
}); });
describe('#32 transfer', () => { describe('#32 transfer', () => {
beforeEach(() => { beforeEach(() => {
cy.login('developer'); cy.login('salesPerson');
cy.viewport(1920, 1080);
cy.visit('/#/ticket/32/sale'); cy.visit('/#/ticket/32/sale');
}); });
it('transfer sale to a new ticket', () => { it('transfer sale to a new ticket', () => {

View File

@ -2,7 +2,6 @@
describe('VnBreadcrumbs', () => { describe('VnBreadcrumbs', () => {
const lastBreadcrumb = '.q-breadcrumbs--last > .q-breadcrumbs__el'; const lastBreadcrumb = '.q-breadcrumbs--last > .q-breadcrumbs__el';
beforeEach(() => { beforeEach(() => {
cy.viewport(1920, 1080);
cy.login('developer'); cy.login('developer');
cy.visit('/'); cy.visit('/');
}); });

View File

@ -1,6 +1,5 @@
describe('WagonTypeCreate', () => { describe('WagonTypeCreate', () => {
beforeEach(() => { beforeEach(() => {
cy.viewport(1920, 1080);
cy.login('developer'); cy.login('developer');
cy.visit('/#/wagon/type/list'); cy.visit('/#/wagon/type/list');
cy.waitForElement('.q-page', 6000); cy.waitForElement('.q-page', 6000);

View File

@ -2,7 +2,6 @@ describe('WagonTypeEdit', () => {
const trayColorRow = const trayColorRow =
'.q-select > .q-field__inner > .q-field__control > .q-field__control-container'; '.q-select > .q-field__inner > .q-field__control > .q-field__control-container';
beforeEach(() => { beforeEach(() => {
cy.viewport(1920, 1080);
cy.login('developer'); cy.login('developer');
cy.visit('/#/wagon/type/1/edit'); cy.visit('/#/wagon/type/1/edit');
}); });

View File

@ -4,7 +4,6 @@ describe('WorkerPit', () => {
const savePIT = '#st-actions > .q-btn-group > .q-btn--standard'; const savePIT = '#st-actions > .q-btn-group > .q-btn--standard';
beforeEach(() => { beforeEach(() => {
cy.viewport(1920, 1080);
cy.login('developer'); cy.login('developer');
cy.visit(`/#/worker/1107/pit`); cy.visit(`/#/worker/1107/pit`);
}); });

View File

@ -4,7 +4,6 @@ describe('ZoneDeliveryDays', () => {
const submitForm = '.q-form > .q-btn > .q-btn__content'; const submitForm = '.q-form > .q-btn > .q-btn__content';
beforeEach(() => { beforeEach(() => {
cy.login('developer'); cy.login('developer');
cy.viewport(1920, 1080);
cy.visit(`/#/zone/delivery-days`); cy.visit(`/#/zone/delivery-days`);
}); });

View File

@ -4,7 +4,6 @@ describe('ZoneUpcomingDeliveries', () => {
beforeEach(() => { beforeEach(() => {
cy.login('developer'); cy.login('developer');
cy.viewport(1920, 1080);
cy.visit(`/#/zone/upcoming-deliveries`); cy.visit(`/#/zone/upcoming-deliveries`);
}); });