diff --git a/src/composables/getColAlign.js b/src/composables/getColAlign.js
index ed6fe30d40..08721ee9f5 100644
--- a/src/composables/getColAlign.js
+++ b/src/composables/getColAlign.js
@@ -7,6 +7,7 @@ export function getColAlign(col) {
case 'number':
align = 'right';
break;
+ case 'time':
case 'date':
case 'time':
case 'checkbox':
diff --git a/src/composables/useCau.js b/src/composables/useCau.js
index a71300464b..43bfc5180b 100644
--- a/src/composables/useCau.js
+++ b/src/composables/useCau.js
@@ -11,7 +11,7 @@ export async function useCau(res, message) {
const { config, headers, request, status, statusText, data } = res || {};
const { params, url, method, signal, headers: confHeaders } = config || {};
const { message: resMessage, code, name } = data?.error || {};
- delete confHeaders.Authorization;
+ delete confHeaders?.Authorization;
const additionalData = {
path: location.hash,
diff --git a/src/css/app.scss b/src/css/app.scss
index 0c5dc97fa7..994ae7ff11 100644
--- a/src/css/app.scss
+++ b/src/css/app.scss
@@ -335,3 +335,7 @@ input::-webkit-inner-spin-button {
border: 1px solid;
box-shadow: 0 4px 6px #00000000;
}
+
+.containerShrinked {
+ width: 80%;
+}
diff --git a/src/i18n/locale/en.yml b/src/i18n/locale/en.yml
index 669d776b4a..114f81d9bf 100644
--- a/src/i18n/locale/en.yml
+++ b/src/i18n/locale/en.yml
@@ -49,6 +49,7 @@ globals:
rowRemoved: Row removed
pleaseWait: Please wait...
noPinnedModules: You don't have any pinned modules
+ enterToConfirm: Press Enter to confirm
summary:
basicData: Basic data
daysOnward: Days onward
diff --git a/src/i18n/locale/es.yml b/src/i18n/locale/es.yml
index 44fb56e755..b64346dc94 100644
--- a/src/i18n/locale/es.yml
+++ b/src/i18n/locale/es.yml
@@ -51,6 +51,7 @@ globals:
pleaseWait: Por favor espera...
noPinnedModules: No has fijado ningún módulo
split: Split
+ enterToConfirm: Pulsa Enter para confirmar
summary:
basicData: Datos básicos
daysOnward: Días adelante
diff --git a/src/pages/Customer/components/CustomerAddressEdit.vue b/src/pages/Customer/components/CustomerAddressEdit.vue
index af1b9c1603..f852c160ac 100644
--- a/src/pages/Customer/components/CustomerAddressEdit.vue
+++ b/src/pages/Customer/components/CustomerAddressEdit.vue
@@ -233,7 +233,7 @@ function handleLocation(data, location) {
postcode: data.postalCode,
city: data.city,
province: data.province,
- country: data.province.country,
+ country: data.province?.country,
}"
@update:model-value="(location) => handleLocation(data, location)"
>
diff --git a/src/pages/Customer/components/CustomerNewPayment.vue b/src/pages/Customer/components/CustomerNewPayment.vue
index 7f45cd7db6..8f61bac89e 100644
--- a/src/pages/Customer/components/CustomerNewPayment.vue
+++ b/src/pages/Customer/components/CustomerNewPayment.vue
@@ -114,7 +114,7 @@ function onBeforeSave(data) {
if (isCash.value && shouldSendEmail.value && !data.email)
return notify(t('There is no assigned email for this client'), 'negative');
- data.bankFk = data.bankFk.id;
+ data.bankFk = data.bankFk?.id;
return data;
}
@@ -189,7 +189,7 @@ async function getAmountPaid() {
:url-create="urlCreate"
:mapper="onBeforeSave"
@on-data-saved="onDataSaved"
- :prevent-submit="true"
+ prevent-submit
>
diff --git a/src/pages/InvoiceOut/Card/InvoiceOutDescriptorMenu.vue b/src/pages/InvoiceOut/Card/InvoiceOutDescriptorMenu.vue
index eb72563e13..1fd9f3e922 100644
--- a/src/pages/InvoiceOut/Card/InvoiceOutDescriptorMenu.vue
+++ b/src/pages/InvoiceOut/Card/InvoiceOutDescriptorMenu.vue
@@ -103,7 +103,7 @@ const refundInvoice = async (withWarehouse) => {
t('refundInvoiceSuccessMessage', {
refundTicket: data[0].id,
}),
- 'positive'
+ 'positive',
);
};
@@ -124,6 +124,13 @@ const showRefundInvoiceForm = () => {
},
});
};
+
+const showExportationLetter = () => {
+ openReport(`InvoiceOuts/${$props.invoiceOutData.ref}/exportation-pdf`, {
+ recipientId: $props.invoiceOutData.client.id,
+ refFk: $props.invoiceOutData.ref,
+ });
+};
@@ -172,7 +179,7 @@ const showRefundInvoiceForm = () => {
t('Confirm deletion'),
t('Are you sure you want to delete this invoice?'),
deleteInvoice,
- redirectToInvoiceOutList
+ redirectToInvoiceOutList,
)
"
>
@@ -185,7 +192,7 @@ const showRefundInvoiceForm = () => {
openConfirmationModal(
'',
t('Are you sure you want to book this invoice?'),
- bookInvoice
+ bookInvoice,
)
"
>
@@ -198,7 +205,7 @@ const showRefundInvoiceForm = () => {
openConfirmationModal(
t('Generate PDF invoice document'),
t('Are you sure you want to generate/regenerate the PDF invoice?'),
- generateInvoicePdf
+ generateInvoicePdf,
)
"
>
@@ -226,6 +233,14 @@ const showRefundInvoiceForm = () => {
{{ t('Create a single ticket with all the content of the current invoice') }}
+
+ {{ t('Show CITES letter') }}
+
@@ -255,7 +270,7 @@ es:
Create a single ticket with all the content of the current invoice: Crear un ticket único con todo el contenido de la factura actual
refundInvoiceSuccessMessage: Se ha creado el siguiente ticket de abono {refundTicket}
The email can't be empty: El email no puede estar vacío
-
+ Show CITES letter: Ver carta CITES
en:
refundInvoiceSuccessMessage: The following refund ticket have been created {refundTicket}
diff --git a/src/pages/InvoiceOut/InvoiceOutFilter.vue b/src/pages/InvoiceOut/InvoiceOutFilter.vue
index cdc9f037ab..648b8e4e6b 100644
--- a/src/pages/InvoiceOut/InvoiceOutFilter.vue
+++ b/src/pages/InvoiceOut/InvoiceOutFilter.vue
@@ -22,7 +22,7 @@ const states = ref();
- {{ t(`params.${tag.label}`) }}:
+ {{ t(`invoiceOut.params.${tag.label}`) }}:
{{ formatFn(tag.value) }}
@@ -84,15 +84,6 @@ const states = ref();
/>
-
-
-
-
-
-
-
-en:
- params:
- search: Contains
- clientFk: Customer
- fi: FI
- amount: Amount
- min: Min
- max: Max
- hasPdf: Has PDF
- issued: Issued
- created: Created
- dued: Dued
-es:
- params:
- search: Contiene
- clientFk: Cliente
- fi: CIF
- amount: Importe
- min: Min
- max: Max
- hasPdf: Tiene PDF
- issued: Emitida
- created: Creada
- dued: Vencida
- Customer ID: ID cliente
- FI: CIF
- Amount: Importe
- Has PDF: Tiene PDF
- Issued: Fecha emisión
- Created: Fecha creación
- Dued: Fecha vencimiento
-
diff --git a/src/pages/InvoiceOut/InvoiceOutList.vue b/src/pages/InvoiceOut/InvoiceOutList.vue
index c7d7ba9f45..873ab030f9 100644
--- a/src/pages/InvoiceOut/InvoiceOutList.vue
+++ b/src/pages/InvoiceOut/InvoiceOutList.vue
@@ -71,14 +71,6 @@ const columns = computed(() => [
inWhere: true,
},
},
- {
- align: 'left',
- name: 'issued',
- label: t('invoiceOut.summary.issued'),
- component: 'date',
- format: (row) => toDate(row.issued),
- columnField: { component: null },
- },
{
align: 'left',
name: 'clientFk',
diff --git a/src/pages/InvoiceOut/InvoiceOutNegativeBases.vue b/src/pages/InvoiceOut/InvoiceOutNegativeBases.vue
index 135eb9aca4..b062678a09 100644
--- a/src/pages/InvoiceOut/InvoiceOutNegativeBases.vue
+++ b/src/pages/InvoiceOut/InvoiceOutNegativeBases.vue
@@ -10,6 +10,8 @@ import CustomerDescriptorProxy from '../Customer/Card/CustomerDescriptorProxy.vu
import TicketDescriptorProxy from '../Ticket/Card/TicketDescriptorProxy.vue';
import WorkerDescriptorProxy from '../Worker/Card/WorkerDescriptorProxy.vue';
import VnInputDate from 'components/common/VnInputDate.vue';
+import InvoiceOutNegativeBasesFilter from './InvoiceOutNegativeBasesFilter.vue';
+import RightMenu from 'src/components/common/RightMenu.vue';
const { t } = useI18n();
const tableRef = ref();
@@ -97,16 +99,19 @@ const columns = computed(() => [
align: 'left',
name: 'isActive',
label: t('invoiceOut.negativeBases.active'),
+ component: 'checkbox',
},
{
align: 'left',
name: 'hasToInvoice',
label: t('invoiceOut.negativeBases.hasToInvoice'),
+ component: 'checkbox',
},
{
align: 'left',
- name: 'hasVerifiedData',
+ name: 'isTaxDataChecked',
label: t('invoiceOut.negativeBases.verifiedData'),
+ component: 'checkbox',
},
{
align: 'left',
@@ -142,7 +147,7 @@ const downloadCSV = async () => {
await invoiceOutGlobalStore.getNegativeBasesCsv(
userParams.from,
userParams.to,
- filterParams
+ filterParams,
);
};
@@ -154,6 +159,11 @@ const downloadCSV = async () => {
+
+
+
+
+
{
auto-load
:is-editable="false"
:use-model="true"
+ :right-search="false"
>
diff --git a/src/pages/InvoiceOut/InvoiceOutNegativeBasesFilter.vue b/src/pages/InvoiceOut/InvoiceOutNegativeBasesFilter.vue
index 6ceec61e4b..cd9836bb78 100644
--- a/src/pages/InvoiceOut/InvoiceOutNegativeBasesFilter.vue
+++ b/src/pages/InvoiceOut/InvoiceOutNegativeBasesFilter.vue
@@ -2,9 +2,10 @@
import { useI18n } from 'vue-i18n';
import VnFilterPanel from 'src/components/ui/VnFilterPanel.vue';
-import VnInput from 'src/components/common/VnInput.vue';
import VnInputDate from 'components/common/VnInputDate.vue';
import VnInputNumber from 'src/components/common/VnInputNumber.vue';
+import VnSelect from 'src/components/common/VnSelect.vue';
+import VnSelectWorker from 'src/components/common/VnSelectWorker.vue';
const { t } = useI18n();
const props = defineProps({
@@ -24,11 +25,11 @@ const props = defineProps({
>
- {{ t(`params.${tag.label}`) }}:
+ {{ t(`invoiceOut.params.${tag.label}`) }}:
{{ formatFn(tag.value) }}
-
+
-
+ v-model="params.company"
+ option-label="code"
+ option-value="code"
+ dense
+ outlined
+ rounded
+ @update:model-value="searchFn()"
+ >
+
+
+
+
+ {{ scope.opt?.code }}
+
+
+ {{ `#${scope.opt?.id}` }}
+
+
+
+
+
-
-
-
-
-
-
-
+ option-label="name"
+ option-value="name"
+ outlined
+ dense
+ rounded
+ @update:model-value="searchFn()"
+ >
+
+
+
+
+ {{ scope.opt?.name }}
+
+
+ {{ `#${scope.opt?.id}` }}
+
+
+
+
+
-
@@ -90,15 +123,18 @@ const props = defineProps({
v-model="params.amount"
:label="t('globals.amount')"
is-outlined
+ :positive="false"
/>
-
diff --git a/src/pages/InvoiceOut/locale/en.yml b/src/pages/InvoiceOut/locale/en.yml
index ee6ba57e6d..9dd31d186a 100644
--- a/src/pages/InvoiceOut/locale/en.yml
+++ b/src/pages/InvoiceOut/locale/en.yml
@@ -4,7 +4,7 @@ invoiceOut:
params:
company: Company
country: Country
- clientId: Client ID
+ clientId: Client
clientSocialName: Client
taxableBase: Base
ticketFk: Ticket
@@ -12,6 +12,18 @@ invoiceOut:
hasToInvoice: Has to invoice
hasVerifiedData: Verified data
workerName: Worker
+ isTaxDataChecked: Verified data
+ amount: Amount
+ clientFk: Client
+ companyFk: Company
+ created: Created
+ dued: Dued
+ customsAgentFk: Custom Agent
+ ref: Reference
+ fi: FI
+ min: Min
+ max: Max
+ hasPdf: Has PDF
card:
issued: Issued
customerCard: Customer card
@@ -53,7 +65,7 @@ invoiceOut:
active: Active
hasToInvoice: Has to Invoice
verifiedData: Verified Data
- comercial: Commercial
+ comercial: Sales person
errors:
downloadCsvFailed: CSV download failed
invoiceOutModule:
diff --git a/src/pages/InvoiceOut/locale/es.yml b/src/pages/InvoiceOut/locale/es.yml
index a059ce18de..79ceb4aa81 100644
--- a/src/pages/InvoiceOut/locale/es.yml
+++ b/src/pages/InvoiceOut/locale/es.yml
@@ -4,7 +4,7 @@ invoiceOut:
params:
company: Empresa
country: País
- clientId: ID del cliente
+ clientId: Cliente
clientSocialName: Cliente
taxableBase: Base
ticketFk: Ticket
@@ -12,6 +12,18 @@ invoiceOut:
hasToInvoice: Debe facturar
hasVerifiedData: Datos verificados
workerName: Comercial
+ isTaxDataChecked: Datos comprobados
+ amount: Importe
+ clientFk: Cliente
+ companyFk: Empresa
+ created: Creada
+ dued: Vencida
+ customsAgentFk: Agente aduanas
+ ref: Referencia
+ fi: CIF
+ min: Min
+ max: Max
+ hasPdf: Tiene PDF
card:
issued: Fecha emisión
customerCard: Ficha del cliente
diff --git a/src/pages/Route/Card/RouteDescriptor.vue b/src/pages/Route/Card/RouteDescriptor.vue
index b6d0ba8c46..503cd1941f 100644
--- a/src/pages/Route/Card/RouteDescriptor.vue
+++ b/src/pages/Route/Card/RouteDescriptor.vue
@@ -6,6 +6,8 @@ import VnLv from 'components/ui/VnLv.vue';
import { dashIfEmpty, toDate } from 'src/filters';
import RouteDescriptorMenu from 'pages/Route/Card/RouteDescriptorMenu.vue';
import filter from './RouteFilter.js';
+import useCardDescription from 'src/composables/useCardDescription';
+import axios from 'axios';
const $props = defineProps({
id: {
@@ -16,7 +18,6 @@ const $props = defineProps({
});
const route = useRoute();
-const { t } = useI18n();
const zone = ref();
const zoneId = ref();
const entityId = computed(() => {
@@ -50,9 +51,9 @@ onMounted(async () => {
width="lg-width"
>
-
-
-
+
+
+
+
diff --git a/src/pages/Ticket/Card/TicketSale.vue b/src/pages/Ticket/Card/TicketSale.vue
index 118761b23d..e680fb2901 100644
--- a/src/pages/Ticket/Card/TicketSale.vue
+++ b/src/pages/Ticket/Card/TicketSale.vue
@@ -22,7 +22,6 @@ import { useVnConfirm } from 'composables/useVnConfirm';
import useNotify from 'src/composables/useNotify.js';
import axios from 'axios';
import VnTable from 'src/components/VnTable/VnTable.vue';
-import VnUsesMana from 'src/components/ui/VnUsesMana.vue';
import VnConfirm from 'src/components/ui/VnConfirm.vue';
import TicketProblems from 'src/components/TicketProblems.vue';
import RightMenu from 'src/components/common/RightMenu.vue';
@@ -33,6 +32,7 @@ const { t } = useI18n();
const { notify } = useNotify();
const { openConfirmationModal } = useVnConfirm();
const editPriceProxyRef = ref(null);
+const editManaProxyRef = ref(null);
const stateBtnDropdownRef = ref(null);
const quasar = useQuasar();
const arrayData = useArrayData('Ticket');
@@ -53,7 +53,6 @@ const transfer = ref({
sales: [],
});
const tableRef = ref([]);
-const canProceed = ref();
watch(
() => route.params.id,
@@ -133,7 +132,6 @@ const columns = computed(() => [
align: 'left',
label: t('globals.amount'),
name: 'amount',
- format: (row) => toCurrency(getSaleTotal(row)),
},
{
align: 'left',
@@ -183,8 +181,6 @@ const resetChanges = async () => {
};
const rowToUpdate = ref(null);
const changeQuantity = async (sale) => {
- canProceed.value = await isSalePrepared(sale);
- if (!canProceed.value) return;
if (
!sale.itemFk ||
sale.quantity == null ||
@@ -193,11 +189,21 @@ const changeQuantity = async (sale) => {
return;
if (!sale.id) return addSale(sale);
+ if (await isSalePrepared(sale)) {
+ await confirmUpdate(() => updateQuantity(sale));
+ } else await updateQuantity(sale);
+};
+
+const updateQuantity = async (sale) => {
try {
+ let { quantity, id } = sale;
if (!rowToUpdate.value) return;
rowToUpdate.value = null;
sale.isNew = false;
- await updateQuantity(sale);
+ const params = { quantity: quantity };
+ await axios.post(`Sales/${id}/updateQuantity`, params);
+ notify('globals.dataSaved', 'positive');
+ tableRef.value.reload();
} catch (e) {
const { quantity } = tableRef.value.CrudModelRef.originalData.find(
(s) => s.id === sale.id,
@@ -207,12 +213,6 @@ const changeQuantity = async (sale) => {
}
};
-const updateQuantity = async ({ quantity, id }) => {
- const params = { quantity: quantity };
- await axios.post(`Sales/${id}/updateQuantity`, params);
- notify('globals.dataSaved', 'positive');
-};
-
const addSale = async (sale) => {
const params = {
barcode: sale.itemFk,
@@ -237,13 +237,17 @@ const addSale = async (sale) => {
sale.isNew = false;
arrayData.fetch({});
};
+const changeConcept = async (sale) => {
+ if (await isSalePrepared(sale)) {
+ await confirmUpdate(() => updateConcept(sale));
+ } else await updateConcept(sale);
+};
const updateConcept = async (sale) => {
- canProceed.value = await isSalePrepared(sale);
- if (!canProceed.value) return;
const data = { newConcept: sale.concept };
await axios.post(`Sales/${sale.id}/updateConcept`, data);
notify('globals.dataSaved', 'positive');
+ tableRef.value.reload();
};
const DEFAULT_EDIT = {
@@ -295,33 +299,43 @@ const onOpenEditDiscountPopover = async (sale) => {
};
}
};
-
-const updatePrice = async (sale) => {
- canProceed.value = await isSalePrepared(sale);
- if (!canProceed.value) return;
+const changePrice = async (sale) => {
const newPrice = edit.value.price;
if (newPrice != null && newPrice != sale.price) {
- await axios.post(`Sales/${sale.id}/updatePrice`, { newPrice });
- sale.price = newPrice;
- edit.value = { ...DEFAULT_EDIT };
- notify('globals.dataSaved', 'positive');
+ if (await isSalePrepared(sale)) {
+ await confirmUpdate(() => updatePrice(sale, newPrice));
+ } else updatePrice(sale, newPrice);
}
-
await getMana();
};
+const updatePrice = async (sale, newPrice) => {
+ await axios.post(`Sales/${sale.id}/updatePrice`, { newPrice });
+ sale.price = newPrice;
+ edit.value = { ...DEFAULT_EDIT };
+ notify('globals.dataSaved', 'positive');
+ tableRef.value.reload();
+};
const changeDiscount = async (sale) => {
- canProceed.value = await isSalePrepared(sale);
- if (!canProceed.value) return;
const newDiscount = edit.value.discount;
- if (newDiscount != null && newDiscount != sale.discount) updateDiscount([sale]);
+ if (newDiscount != null && newDiscount != sale.discount) {
+ if (await isSalePrepared(sale))
+ await confirmUpdate(() => updateDiscount([sale], newDiscount));
+ else await updateDiscount([sale], newDiscount);
+ }
+};
+
+const updateDiscounts = async (sales, newDiscount = null) => {
+ const salesTracking = await fetchSalesTracking();
+
+ const someSaleIsPrepared = salesTracking.some((sale) =>
+ matchSale(salesTracking, sale),
+ );
+ if (someSaleIsPrepared) await confirmUpdate(() => updateDiscount(sales, newDiscount));
+ else updateDiscount(sales, newDiscount);
};
const updateDiscount = async (sales, newDiscount = null) => {
- for (const sale of sales) {
- const canProceed = await isSalePrepared(sale);
- if (!canProceed) return;
- }
const saleIds = sales.map((sale) => sale.id);
const _newDiscount = newDiscount || edit.value.discount;
const params = {
@@ -424,9 +438,13 @@ onMounted(async () => {
const items = ref([]);
const newRow = ref({});
+const changeItem = async (sale) => {
+ if (await isSalePrepared(sale)) {
+ await confirmUpdate(() => updateItem(sale));
+ } else await updateItem(sale);
+};
+
const updateItem = async (row) => {
- canProceed.value = await isSalePrepared(row);
- if (!canProceed.value) return;
const selectedItem = items.value.find((item) => item.id === row.itemFk);
if (selectedItem) {
row.item = selectedItem;
@@ -470,7 +488,18 @@ const endNewRow = (row) => {
}
};
-async function isSalePrepared(item) {
+async function confirmUpdate(cb) {
+ await quasar
+ .dialog({
+ component: VnConfirm,
+ componentProps: {
+ title: t('Item prepared'),
+ message: t('This item is already prepared. Do you want to continue?'),
+ },
+ })
+ .onOk(cb);
+}
+async function fetchSalesTracking() {
const filter = {
params: {
where: { ticketFk: route.params.id },
@@ -482,48 +511,37 @@ async function isSalePrepared(item) {
filter: JSON.stringify(filter),
},
});
-
- const matchingSale = data.find((sale) => sale.itemFk === item.itemFk);
- if (!matchingSale) {
- return true;
- }
-
- if (
- matchingSale.hasSaleGroupDetail ||
- matchingSale.isControled ||
- matchingSale.isPrepared ||
- matchingSale.isPrevious ||
- matchingSale.isPreviousSelected
- ) {
- try {
- await new Promise((resolve, reject) => {
- quasar
- .dialog({
- component: VnConfirm,
- componentProps: {
- title: t('Item prepared'),
- message: t(
- 'This item is already prepared. Do you want to continue?',
- ),
- data: item,
- },
- })
- .onOk(() => resolve(true))
- .onCancel(() => reject(new Error('cancelled')));
- });
- } catch (error) {
- tableRef.value.reload();
- return false;
- }
- }
- return true;
+ return data;
}
+async function isSalePrepared(sale) {
+ const data = await fetchSalesTracking();
+ return matchSale(data, sale);
+}
+function matchSale(data, sale) {
+ const matchingSale = data.find(({ itemFk }) => itemFk === sale.itemFk);
+
+ if (!matchingSale) {
+ return false;
+ }
+
+ return isPrepared(matchingSale);
+}
+function isPrepared(sale) {
+ const flagsToCheck = [
+ 'hasSaleGroupDetail',
+ 'isControled',
+ 'isPrepared',
+ 'isPrevious',
+ 'isPreviousSelected',
+ ];
+ return flagsToCheck.some((flag) => sale[flag] === 1);
+}
watch(
() => newRow.value.itemFk,
(newItemFk) => {
if (newItemFk) {
- updateItem(newRow.value);
+ changeItem(newRow.value);
}
},
);
@@ -584,7 +602,7 @@ watch(
:mana="mana"
:ticket-config="ticketConfig"
@get-mana="getMana()"
- @update-discounts="updateDiscount"
+ @update-discounts="updateDiscounts"
@refresh-table="resetChanges"
/>
@@ -741,16 +759,21 @@ watch(
-
+
(rowToUpdate = row)"
@focus="edit.oldQuantity = row.quantity"
/>
@@ -764,10 +787,12 @@ watch(
editManaProxyRef.save(row)"
v-model.number="edit.price"
:label="t('basicData.price')"
type="number"
@@ -781,31 +806,30 @@ watch(
{{ toPercentage(row.discount / 100) }}
+
-
- {
- changeDiscount(row);
- popup.hide();
- }
- "
- v-model.number="edit.discount"
- :label="t('ticketSale.discount')"
- type="number"
- />
-
+ editManaProxyRef.save(row)"
+ v-model.number="edit.discount"
+ :label="t('ticketSale.discount')"
+ type="number"
+ />
{{ toPercentage(row.discount / 100) }}
+
+ {{ toCurrency(getSaleTotal(row)) }}
+
diff --git a/src/pages/Ticket/TicketFuture.vue b/src/pages/Ticket/TicketFuture.vue
index 9876ced786..92911cd254 100644
--- a/src/pages/Ticket/TicketFuture.vue
+++ b/src/pages/Ticket/TicketFuture.vue
@@ -16,6 +16,7 @@ import useNotify from 'src/composables/useNotify.js';
import { useState } from 'src/composables/useState';
import { toDateTimeFormat } from 'src/filters/date.js';
import axios from 'axios';
+import TicketProblems from 'src/components/TicketProblems.vue';
const state = useState();
const { t } = useI18n();
@@ -286,71 +287,7 @@ watch(
-
-
- {{ t('futureTickets.noVerified') }}
-
-
-
-
- {{ t('futureTickets.purchaseRequest') }}
-
-
-
-
- {{ t('ticketSale.noVisible') }}
-
-
-
-
- {{ t('futureTickets.clientFrozen') }}
-
-
-
-
- {{ t('futureTickets.risk') }}: {{ row.risk }}
-
-
-
-
- {{ t('futureTickets.componentLack') }}
-
-
-
-
- {{ t('futureTickets.rounding') }}
-
-
+
diff --git a/src/pages/Travel/Card/TravelThermographsForm.vue b/src/pages/Travel/Card/TravelThermographsForm.vue
index 7aec32972c..446e5d5062 100644
--- a/src/pages/Travel/Card/TravelThermographsForm.vue
+++ b/src/pages/Travel/Card/TravelThermographsForm.vue
@@ -209,7 +209,7 @@ const onThermographCreated = async (data) => {
}"
sort-by="thermographFk ASC"
option-label="thermographFk"
- option-filter-value="id"
+ option-filter-value="thermographFk"
:disable="viewAction === 'edit'"
:tooltip="t('New thermograph')"
:roles-allowed-to-create="['logistic']"
diff --git a/src/pages/Travel/ExtraCommunity.vue b/src/pages/Travel/ExtraCommunity.vue
index dee9d923a0..ac46caa44a 100644
--- a/src/pages/Travel/ExtraCommunity.vue
+++ b/src/pages/Travel/ExtraCommunity.vue
@@ -2,6 +2,7 @@
import { onMounted, ref, computed, watch } from 'vue';
import { QBtn } from 'quasar';
import { useI18n } from 'vue-i18n';
+import { useRoute } from 'vue-router';
import SupplierDescriptorProxy from 'src/pages/Supplier/Card/SupplierDescriptorProxy.vue';
import TravelDescriptorProxy from 'src/pages/Travel/Card/TravelDescriptorProxy.vue';
@@ -22,6 +23,8 @@ import VnPopup from 'src/components/common/VnPopup.vue';
const stateStore = useStateStore();
const { t } = useI18n();
const { openReport } = usePrintService();
+const route = useRoute();
+const tableParams = ref();
const shippedFrom = ref(Date.vnNew());
const landedTo = ref(Date.vnNew());
@@ -143,7 +146,7 @@ const columns = computed(() => [
sortable: true,
},
{
- label: t('globals.pageTitles.supplier'),
+ label: t('extraCommunity.cargoShip'),
field: 'cargoSupplierNickname',
name: 'cargoSupplierNickname',
align: 'left',
@@ -171,7 +174,7 @@ const columns = computed(() => [
? value.reduce((sum, entry) => {
return sum + (entry.invoiceAmount || 0);
}, 0)
- : 0
+ : 0,
),
},
{
@@ -200,7 +203,7 @@ const columns = computed(() => [
sortable: true,
},
{
- label: t('kg'),
+ label: t('extraCommunity.kg'),
field: 'kg',
name: 'kg',
align: 'left',
@@ -208,7 +211,7 @@ const columns = computed(() => [
sortable: true,
},
{
- label: t('physicKg'),
+ label: t('extraCommunity.physicKg'),
field: 'loadedKg',
name: 'loadedKg',
align: 'left',
@@ -232,7 +235,7 @@ const columns = computed(() => [
sortable: true,
},
{
- label: t('shipped'),
+ label: t('extraCommunity.shipped'),
field: 'shipped',
name: 'shipped',
align: 'left',
@@ -249,7 +252,7 @@ const columns = computed(() => [
sortable: true,
},
{
- label: t('landed'),
+ label: t('extraCommunity.landed'),
field: 'landed',
name: 'landed',
align: 'left',
@@ -258,7 +261,7 @@ const columns = computed(() => [
format: (value) => toDate(value),
},
{
- label: t('notes'),
+ label: t('extraCommunity.notes'),
field: '',
name: 'notes',
align: 'center',
@@ -284,7 +287,7 @@ watch(
if (!arrayData.store.data) return;
onStoreDataChange();
},
- { deep: true, immediate: true }
+ { deep: true, immediate: true },
);
const openReportPdf = () => {
@@ -451,13 +454,24 @@ const getColor = (percentage) => {
for (const { value, className } of travelKgPercentages.value)
if (percentage > value) return className;
};
+
+const filteredEntries = (entries) => {
+ if (!tableParams?.value?.entrySupplierFk) return entries;
+ return entries?.filter(
+ (entry) => entry.supplierFk === tableParams?.value?.entrySupplierFk,
+ );
+};
+
+watch(route, () => {
+ tableParams.value = JSON.parse(route.query.table);
+});
@@ -521,7 +535,7 @@ const getColor = (percentage) => {
? tableColumnComponents[col.name].event(
rows[props.rowIndex][col.field],
col.field,
- props.rowIndex
+ props.rowIndex,
)
: {}
"
@@ -546,7 +560,7 @@ const getColor = (percentage) => {
},
{
link: ['id', 'cargoSupplierNickname'].includes(
- col.name
+ col.name,
),
},
]"
@@ -564,9 +578,8 @@ const getColor = (percentage) => {
-
{
name="warning"
color="negative"
size="md"
- :title="t('requiresInspection')"
+ :title="t('extraCommunity.requiresInspection')"
>
@@ -709,24 +722,3 @@ const getColor = (percentage) => {
width: max-content;
}
-
-en:
- searchExtraCommunity: Search for extra community shipping
- kg: BI. KG
- physicKg: Phy. KG
- shipped: W. shipped
- landed: W. landed
- requiresInspection: Requires inspection
- BIP: Boder Inspection Point
- notes: Notes
-es:
- searchExtraCommunity: Buscar por envío extra comunitario
- kg: KG Bloq.
- physicKg: KG físico
- shipped: F. envío
- landed: F. llegada
- notes: Notas
- Open as PDF: Abrir como PDF
- requiresInspection: Requiere inspección
- BIP: Punto de Inspección Fronteriza
-
diff --git a/src/pages/Travel/ExtraCommunityFilter.vue b/src/pages/Travel/ExtraCommunityFilter.vue
index b22574632f..29d3423340 100644
--- a/src/pages/Travel/ExtraCommunityFilter.vue
+++ b/src/pages/Travel/ExtraCommunityFilter.vue
@@ -79,7 +79,7 @@ warehouses();
- {{ t(`params.${tag.label}`) }}:
+ {{ t(`extraCommunity.filter.${tag.label}`) }}:
{{ formatFn(tag.value) }}
@@ -92,7 +92,7 @@ warehouses();
@@ -103,7 +103,7 @@ warehouses();
+
+
+
+
+
-
-
-en:
- params:
- id: Id
- reference: Reference
- totalEntries: Total entries
- agencyModeFk: Agency
- warehouseInFk: Warehouse In
- warehouseOutFk: Warehouse Out
- shippedFrom: Shipped from
- landedTo: Landed to
- cargoSupplierFk: Supplier
- continent: Continent out
-es:
- params:
- id: Id
- reference: Referencia
- totalEntries: Ent. totales
- agencyModeFk: Agencia
- warehouseInFk: Alm. entrada
- warehouseOutFk: Alm. salida
- shippedFrom: Llegada desde
- landedTo: Llegada hasta
- cargoSupplierFk: Proveedor
- continent: Cont. Salida
-
diff --git a/src/pages/Travel/locale/en.yml b/src/pages/Travel/locale/en.yml
new file mode 100644
index 0000000000..ddef66f2f0
--- /dev/null
+++ b/src/pages/Travel/locale/en.yml
@@ -0,0 +1,22 @@
+extraCommunity:
+ cargoShip: Cargo ship
+ searchExtraCommunity: Search for extra community shipping
+ kg: BI. KG
+ physicKg: Phy. KG
+ shipped: W. shipped
+ landed: W. landed
+ requiresInspection: Requires inspection
+ BIP: Boder Inspection Point
+ notes: Notes
+ filter:
+ id: Id
+ reference: Reference
+ totalEntries: Total entries
+ agencyModeFk: Agency
+ warehouseInFk: Warehouse In
+ warehouseOutFk: Warehouse Out
+ shippedFrom: Shipped from
+ landedTo: Landed to
+ cargoSupplierFk: Cargo supplier
+ continent: Continent out
+ entrySupplierFk: Supplier
diff --git a/src/pages/Travel/locale/es.yml b/src/pages/Travel/locale/es.yml
new file mode 100644
index 0000000000..1542d88926
--- /dev/null
+++ b/src/pages/Travel/locale/es.yml
@@ -0,0 +1,23 @@
+extraCommunity:
+ cargoShip: Carguera
+ searchExtraCommunity: Buscar por envío extra comunitario
+ kg: KG Bloq.
+ physicKg: KG físico
+ shipped: F. envío
+ landed: F. llegada
+ notes: Notas
+ Open as PDF: Abrir como PDF
+ requiresInspection: Requiere inspección
+ BIP: Punto de Inspección Fronteriza
+ filter:
+ id: Id
+ reference: Referencia
+ totalEntries: Ent. totales
+ agencyModeFk: Agencia
+ warehouseInFk: Alm. entrada
+ warehouseOutFk: Alm. salida
+ shippedFrom: Llegada desde
+ landedTo: Llegada hasta
+ cargoSupplierFk: Carguera
+ continent: Cont. Salida
+ entrySupplierFk: Proveedor
diff --git a/src/pages/Worker/Card/WorkerFormation.vue b/src/pages/Worker/Card/WorkerFormation.vue
index e05eca7f8c..e8680f7dd8 100644
--- a/src/pages/Worker/Card/WorkerFormation.vue
+++ b/src/pages/Worker/Card/WorkerFormation.vue
@@ -119,7 +119,7 @@ const columns = computed(() => [
:url="`Workers/${entityId}/trainingCourse`"
:url-create="`Workers/${entityId}/trainingCourse`"
save-url="TrainingCourses/crud"
- :filter="courseFilter"
+ :user-filter="courseFilter"
:create="{
urlCreate: 'trainingCourses',
title: t('Create training course'),
diff --git a/src/pages/Worker/Card/WorkerMedical.vue b/src/pages/Worker/Card/WorkerMedical.vue
index c220df76a2..b3a599af78 100644
--- a/src/pages/Worker/Card/WorkerMedical.vue
+++ b/src/pages/Worker/Card/WorkerMedical.vue
@@ -8,6 +8,17 @@ const { t } = useI18n();
const route = useRoute();
const entityId = computed(() => route.params.id);
+const centerFilter = {
+ include: [
+ {
+ relation: 'center',
+ scope: {
+ fields: ['id', 'name'],
+ },
+ },
+ ],
+};
+
const columns = [
{
align: 'left',
@@ -33,7 +44,7 @@ const columns = [
create: true,
component: 'select',
attrs: {
- url: 'medicalCenters',
+ url: 'centers',
fields: ['id', 'name'],
},
},
@@ -84,6 +95,7 @@ const columns = [
ref="tableRef"
data-key="WorkerMedical"
:url="`Workers/${entityId}/medicalReview`"
+ :user-filter="centerFilter"
save-url="MedicalReviews/crud"
:create="{
urlCreate: 'medicalReviews',
diff --git a/src/pages/Zone/Card/ZoneBasicData.vue b/src/pages/Zone/Card/ZoneBasicData.vue
index b38d2749b6..03013f011b 100644
--- a/src/pages/Zone/Card/ZoneBasicData.vue
+++ b/src/pages/Zone/Card/ZoneBasicData.vue
@@ -25,7 +25,7 @@ const setFilteredAddresses = (data) => {
@on-fetch="(data) => (validAddresses = data)"
/>
-
+
{
:label="t('Name')"
clearable
v-model="data.name"
+ :required="true"
/>
@@ -83,7 +84,7 @@ const setFilteredAddresses = (data) => {
type="number"
min="0"
/>
-
+
@@ -92,7 +93,7 @@ const setFilteredAddresses = (data) => {
:label="t('Price')"
type="number"
min="0"
- required="true"
+ :required="true"
clearable
/>
{
:label="t('Price optimum')"
type="number"
min="0"
- required="true"
+ :required="true"
clearable
/>
diff --git a/src/pages/Zone/Card/ZoneCalendar.vue b/src/pages/Zone/Card/ZoneCalendar.vue
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/src/pages/Zone/ZoneFilterPanel.vue b/src/pages/Zone/ZoneFilterPanel.vue
index 3a35527ab6..bbe12189a2 100644
--- a/src/pages/Zone/ZoneFilterPanel.vue
+++ b/src/pages/Zone/ZoneFilterPanel.vue
@@ -38,7 +38,12 @@ const agencies = ref([]);
-
+
@@ -53,6 +58,7 @@ const agencies = ref([]);
dense
outlined
rounded
+ data-cy="zoneFilterPanelAgencySelect"
>
diff --git a/src/pages/Zone/ZoneList.vue b/src/pages/Zone/ZoneList.vue
index 1fa539c910..a82bbb2854 100644
--- a/src/pages/Zone/ZoneList.vue
+++ b/src/pages/Zone/ZoneList.vue
@@ -65,7 +65,6 @@ const tableFilter = {
const columns = computed(() => [
{
- align: 'left',
name: 'id',
label: t('list.id'),
chip: {
@@ -75,6 +74,8 @@ const columns = computed(() => [
columnFilter: {
inWhere: true,
},
+ columnClass: 'shrink-column',
+ component: 'number',
},
{
align: 'left',
@@ -106,7 +107,6 @@ const columns = computed(() => [
format: (row, dashIfEmpty) => dashIfEmpty(row?.agencyMode?.name),
},
{
- align: 'left',
name: 'price',
label: t('list.price'),
cardVisible: true,
@@ -114,9 +114,11 @@ const columns = computed(() => [
columnFilter: {
inWhere: true,
},
+ columnClass: 'shrink-column',
+ component: 'number',
},
{
- align: 'left',
+ align: 'center',
name: 'hour',
label: t('list.close'),
cardVisible: true,
@@ -129,6 +131,7 @@ const columns = computed(() => [
label: t('list.addressFk'),
cardVisible: true,
columnFilter: false,
+ columnClass: 'expand',
},
{
align: 'right',
@@ -177,67 +180,73 @@ function formatRow(row) {
-
-
- {{ dashIfEmpty(formatRow(row)) }}
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+ {{ dashIfEmpty(formatRow(row)) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -245,3 +254,20 @@ es:
Search zone: Buscar zona
You can search zones by id or name: Puedes buscar zonas por id o nombre
+
+
diff --git a/src/pages/Zone/ZoneUpcoming.vue b/src/pages/Zone/ZoneUpcoming.vue
index c74ae6078f..adcdfbc044 100644
--- a/src/pages/Zone/ZoneUpcoming.vue
+++ b/src/pages/Zone/ZoneUpcoming.vue
@@ -56,7 +56,7 @@ onMounted(() => weekdayStore.initStore());
-
+
{
},
});
});
-
+
it('should open buyLabel when is supplier', () => {
- cy.get(
- '[to="/null/3"] > .q-card > :nth-child(2) > .q-btn > .q-btn__content > .q-icon'
- ).click();
+ cy.dataCy('cardBtn').eq(2).click();
cy.dataCy('printLabelsBtn').click();
cy.window().its('open').should('be.called');
});
diff --git a/test/cypress/integration/ticket/ticketSale.spec.js b/test/cypress/integration/ticket/ticketSale.spec.js
index aed8dc85ac..63562bd26e 100644
--- a/test/cypress/integration/ticket/ticketSale.spec.js
+++ b/test/cypress/integration/ticket/ticketSale.spec.js
@@ -1,122 +1,208 @@
///
describe('TicketSale', () => {
- beforeEach(() => {
- cy.login('developer');
- cy.viewport(1920, 1080);
- cy.visit('/#/ticket/31/sale');
- });
-
- const firstRow = 'tbody > :nth-child(1)';
-
- const selectFirstRow = () => {
- cy.waitForElement(firstRow);
- cy.get(firstRow).find('.q-checkbox__inner').click();
- };
-
- it('it should add item to basket', () => {
- cy.window().then((win) => {
- cy.stub(win, 'open').as('windowOpen');
+ describe('Free ticket #31', () => {
+ beforeEach(() => {
+ cy.login('developer');
+ cy.viewport(1920, 1080);
+ cy.visit('/#/ticket/31/sale');
});
- cy.dataCy('ticketSaleAddToBasketBtn').should('exist');
- cy.dataCy('ticketSaleAddToBasketBtn').click();
- cy.get('@windowOpen').should('be.calledWithMatch', /\/order\/\d+\/catalog/);
- });
- it('should send SMS', () => {
- selectFirstRow();
- cy.dataCy('ticketSaleMoreActionsDropdown').click();
- cy.waitForElement('[data-cy="sendShortageSMSItem"]');
- cy.dataCy('sendShortageSMSItem').should('exist');
- cy.dataCy('sendShortageSMSItem').click();
- cy.dataCy('vnSmsDialog').should('exist');
- cy.dataCy('sendSmsBtn').click();
- cy.checkNotification('SMS sent');
- });
+ const firstRow = 'tbody > :nth-child(1)';
- it('should recalculate price when "Recalculate price" is clicked', () => {
- cy.intercept('POST', '**/recalculatePrice').as('recalculatePrice');
- selectFirstRow();
- cy.dataCy('ticketSaleMoreActionsDropdown').click();
- cy.waitForElement('[data-cy="recalculatePriceItem"]');
- cy.dataCy('recalculatePriceItem').should('exist');
- cy.dataCy('recalculatePriceItem').click();
- cy.wait('@recalculatePrice').its('response.statusCode').should('eq', 200);
- cy.checkNotification('Data saved');
- });
+ const selectFirstRow = () => {
+ cy.waitForElement(firstRow);
+ cy.get(firstRow).find('.q-checkbox__inner').click();
+ };
- it('should update discount when "Update discount" is clicked', () => {
- selectFirstRow();
- cy.dataCy('ticketSaleMoreActionsDropdown').click();
- cy.waitForElement('[data-cy="updateDiscountItem"]');
- cy.dataCy('updateDiscountItem').should('exist');
- cy.dataCy('updateDiscountItem').click();
- cy.waitForElement('[data-cy="ticketSaleDiscountInput"]');
- cy.dataCy('ticketSaleDiscountInput').find('input').focus();
- cy.dataCy('ticketSaleDiscountInput').find('input').type('10');
- cy.dataCy('saveManaBtn').click();
- cy.waitForElement('.q-notification__message');
- cy.checkNotification('Data saved');
- });
+ it('it should add item to basket', () => {
+ cy.window().then((win) => {
+ cy.stub(win, 'open').as('windowOpen');
+ });
+ cy.dataCy('ticketSaleAddToBasketBtn').should('exist');
+ cy.dataCy('ticketSaleAddToBasketBtn').click();
+ cy.get('@windowOpen').should('be.calledWithMatch', /\/order\/\d+\/catalog/);
+ });
- it('adds claim', () => {
- selectFirstRow();
- cy.dataCy('ticketSaleMoreActionsDropdown').click();
- cy.dataCy('createClaimItem').click();
- cy.dataCy('VnConfirm_confirm').click();
- cy.url().should('contain', 'claim/');
- // Delete created claim to avoid cluttering the database
- cy.dataCy('descriptor-more-opts').click();
- cy.dataCy('deleteClaim').click();
- cy.dataCy('VnConfirm_confirm').click();
- cy.checkNotification('Data deleted');
- });
+ it('should send SMS', () => {
+ selectFirstRow();
+ cy.dataCy('ticketSaleMoreActionsDropdown').click();
+ cy.waitForElement('[data-cy="sendShortageSMSItem"]');
+ cy.dataCy('sendShortageSMSItem').should('exist');
+ cy.dataCy('sendShortageSMSItem').click();
+ cy.dataCy('vnSmsDialog').should('exist');
+ cy.dataCy('sendSmsBtn').click();
+ cy.checkNotification('SMS sent');
+ });
- it('marks row as reserved', () => {
- selectFirstRow();
- cy.dataCy('ticketSaleMoreActionsDropdown').click();
- cy.waitForElement('[data-cy="markAsReservedItem"]');
- cy.dataCy('markAsReservedItem').click();
- cy.dataCy('ticketSaleReservedIcon').should('exist');
- });
+ it('should recalculate price when "Recalculate price" is clicked', () => {
+ cy.intercept('POST', '**/recalculatePrice').as('recalculatePrice');
+ selectFirstRow();
+ cy.dataCy('ticketSaleMoreActionsDropdown').click();
+ cy.waitForElement('[data-cy="recalculatePriceItem"]');
+ cy.dataCy('recalculatePriceItem').should('exist');
+ cy.dataCy('recalculatePriceItem').click();
+ cy.wait('@recalculatePrice').its('response.statusCode').should('eq', 200);
+ cy.checkNotification('Data saved');
+ });
- it('unmarks row as reserved', () => {
- selectFirstRow();
- cy.dataCy('ticketSaleMoreActionsDropdown').click();
- cy.waitForElement('[data-cy="unmarkAsReservedItem"]');
- cy.dataCy('unmarkAsReservedItem').click();
- cy.dataCy('ticketSaleReservedIcon').should('not.exist');
- });
+ it('should update discount when "Update discount" is clicked', () => {
+ selectFirstRow();
+ cy.dataCy('ticketSaleMoreActionsDropdown').click();
+ cy.waitForElement('[data-cy="updateDiscountItem"]');
+ cy.dataCy('updateDiscountItem').should('exist');
+ cy.dataCy('updateDiscountItem').click();
+ cy.waitForElement('[data-cy="ticketSaleDiscountInput"]');
+ cy.dataCy('ticketSaleDiscountInput').find('input').focus();
+ cy.dataCy('ticketSaleDiscountInput').find('input').type('10');
+ cy.dataCy('saveManaBtn').click();
+ cy.waitForElement('.q-notification__message');
+ cy.checkNotification('Data saved');
+ });
- it('refunds row with warehouse', () => {
- selectFirstRow();
- cy.dataCy('ticketSaleMoreActionsDropdown').click();
- cy.dataCy('ticketSaleRefundItem').click();
- cy.dataCy('ticketSaleRefundWithWarehouse').click();
- cy.checkNotification('The following refund ticket have been created');
- });
+ it('adds claim', () => {
+ selectFirstRow();
+ cy.dataCy('ticketSaleMoreActionsDropdown').click();
+ cy.dataCy('createClaimItem').click();
+ cy.dataCy('VnConfirm_confirm').click();
+ cy.url().should('contain', 'claim/');
+ // Delete created claim to avoid cluttering the database
+ cy.dataCy('descriptor-more-opts').click();
+ cy.dataCy('deleteClaim').click();
+ cy.dataCy('VnConfirm_confirm').click();
+ cy.checkNotification('Data deleted');
+ });
- it('refunds row without warehouse', () => {
- selectFirstRow();
- cy.dataCy('ticketSaleMoreActionsDropdown').click();
- cy.dataCy('ticketSaleRefundItem').click();
- cy.dataCy('ticketSaleRefundWithoutWarehouse').click();
- cy.checkNotification('The following refund ticket have been created');
- });
+ it('marks row as reserved', () => {
+ selectFirstRow();
+ cy.dataCy('ticketSaleMoreActionsDropdown').click();
+ cy.waitForElement('[data-cy="markAsReservedItem"]');
+ cy.dataCy('markAsReservedItem').click();
+ cy.dataCy('ticketSaleReservedIcon').should('exist');
+ });
- it('transfer sale to a new ticket', () => {
- cy.visit('/#/ticket/32/sale');
- cy.get('.q-item > .q-item__label').should('have.text', ' #32');
- selectFirstRow();
- cy.dataCy('ticketSaleTransferBtn').click();
- cy.dataCy('ticketTransferPopup').should('exist');
- cy.dataCy('ticketTransferNewTicketBtn').click();
- //check the new ticket has been created succesfully
- cy.get('.q-item > .q-item__label').should('not.have.text', ' #32');
- });
+ it('unmarks row as reserved', () => {
+ selectFirstRow();
+ cy.dataCy('ticketSaleMoreActionsDropdown').click();
+ cy.waitForElement('[data-cy="unmarkAsReservedItem"]');
+ cy.dataCy('unmarkAsReservedItem').click();
+ cy.dataCy('ticketSaleReservedIcon').should('not.exist');
+ });
- it('should redirect to ticket logs', () => {
- cy.get(firstRow).find('.q-btn:last').click();
- cy.url().should('match', /\/ticket\/31\/log/);
+ it('refunds row with warehouse', () => {
+ selectFirstRow();
+ cy.dataCy('ticketSaleMoreActionsDropdown').click();
+ cy.dataCy('ticketSaleRefundItem').click();
+ cy.dataCy('ticketSaleRefundWithWarehouse').click();
+ cy.checkNotification('The following refund ticket have been created');
+ });
+
+ it('refunds row without warehouse', () => {
+ selectFirstRow();
+ cy.dataCy('ticketSaleMoreActionsDropdown').click();
+ cy.dataCy('ticketSaleRefundItem').click();
+ cy.dataCy('ticketSaleRefundWithoutWarehouse').click();
+ cy.checkNotification('The following refund ticket have been created');
+ });
+
+ it('transfer sale to a new ticket', () => {
+ cy.visit('/#/ticket/32/sale');
+ cy.get('.q-item > .q-item__label').should('have.text', ' #32');
+ selectFirstRow();
+ cy.dataCy('ticketSaleTransferBtn').click();
+ cy.dataCy('ticketTransferPopup').should('exist');
+ cy.dataCy('ticketTransferNewTicketBtn').click();
+ //check the new ticket has been created succesfully
+ cy.get('.q-item > .q-item__label').should('not.have.text', ' #32');
+ });
+
+ it('should redirect to ticket logs', () => {
+ cy.get(firstRow).find('.q-btn:last').click();
+ cy.url().should('match', /\/ticket\/31\/log/);
+ });
+ });
+ describe('Ticket prepared #23', () => {
+ beforeEach(() => {
+ cy.login('developer');
+ cy.viewport(1920, 1080);
+ cy.visit('/#/ticket/23/sale');
+ });
+
+ const firstRow = 'tbody > :nth-child(1)';
+
+ const selectFirstRow = () => {
+ cy.waitForElement(firstRow);
+ cy.get(firstRow).find('.q-checkbox__inner').click();
+ };
+
+ it('update price', () => {
+ const price = Number((Math.random() * 99 + 1).toFixed(2));
+ cy.waitForElement(firstRow);
+ cy.get(':nth-child(10) > .q-btn').click();
+ cy.waitForElement('[data-cy="ticketEditManaProxy"]');
+ cy.dataCy('ticketEditManaProxy').should('exist');
+ cy.waitForElement('[data-cy="Price_input"]');
+ cy.dataCy('Price_input').clear();
+ cy.dataCy('Price_input').type(price);
+ cy.dataCy('saveManaBtn').click();
+ handleVnConfirm();
+
+ cy.get(':nth-child(10) > .q-btn > .q-btn__content').should(
+ 'have.text',
+ `€${price}`,
+ );
+ });
+ it('update dicount', () => {
+ const discount = Math.floor(Math.random() * 100) + 1;
+ selectFirstRow();
+ cy.get(':nth-child(11) > .q-btn').click();
+ cy.waitForElement('[data-cy="ticketEditManaProxy"]');
+ cy.dataCy('ticketEditManaProxy').should('exist');
+ cy.waitForElement('[data-cy="Disc_input"]');
+ cy.dataCy('Disc_input').clear();
+ cy.dataCy('Disc_input').type(discount);
+ cy.dataCy('saveManaBtn').click();
+ handleVnConfirm();
+
+ cy.get(':nth-child(11) > .q-btn > .q-btn__content').should(
+ 'have.text',
+ `${discount}.00%`,
+ );
+ });
+
+ it('change concept', () => {
+ const quantity = Math.floor(Math.random() * 100) + 1;
+ cy.waitForElement(firstRow);
+ cy.get(':nth-child(8) > .row').click();
+ cy.get(
+ '.q-menu > [data-v-ca3f07a4=""] > .q-field > .q-field__inner > .q-field__control > .q-field__control-container > [data-cy="undefined_input"]',
+ )
+ .type(quantity)
+ .type('{enter}');
+ handleVnConfirm();
+
+ cy.get(':nth-child(8) >.row').should('contain.text', `${quantity}`);
+ });
+ it('changequantity ', () => {
+ const quantity = Math.floor(Math.random() * 100) + 1;
+ cy.waitForElement(firstRow);
+ cy.dataCy('ticketSaleQuantityInput').clear();
+ cy.dataCy('ticketSaleQuantityInput').type(quantity).trigger('tab');
+ cy.get('.q-page > :nth-child(6)').click();
+
+ handleVnConfirm();
+
+ cy.get('[data-cy="ticketSaleQuantityInput"]')
+ .find('[data-cy="undefined_input"]')
+ .should('have.value', `${quantity}`);
+ });
});
});
+
+function handleVnConfirm() {
+ cy.get('[data-cy="VnConfirm_confirm"] > .q-btn__content > .block').click();
+ cy.waitForElement('.q-notification__message');
+
+ cy.get('.q-notification__message').should('be.visible');
+ cy.checkNotification('Data saved');
+}
diff --git a/test/cypress/integration/zone/zoneList.spec.js b/test/cypress/integration/zone/zoneList.spec.js
index 8d01d4e4e8..68e9246354 100644
--- a/test/cypress/integration/zone/zoneList.spec.js
+++ b/test/cypress/integration/zone/zoneList.spec.js
@@ -1,4 +1,5 @@
describe('ZoneList', () => {
+ const agency = 'inhouse pickup';
beforeEach(() => {
cy.viewport(1280, 720);
cy.login('developer');
@@ -6,11 +7,15 @@ describe('ZoneList', () => {
});
it('should filter by agency', () => {
- cy.get('input[aria-label="Agency"]').type('{downArrow}{enter}');
+ cy.dataCy('zoneFilterPanelNameInput').type('{downArrow}{enter}');
});
it('should open the zone summary', () => {
- cy.get('input[aria-label="Name"]').type('zone refund');
- cy.get('.q-scrollarea__content > .q-btn--standard > .q-btn__content').click();
+ cy.dataCy('zoneFilterPanelAgencySelect').type(agency);
+ cy.get('.q-menu .q-item').contains(agency).click();
+ cy.get(':nth-child(1) > [data-col-field="agencyModeFk"]').should(
+ 'include.text',
+ agency,
+ );
});
});