diff --git a/src/components/FormModelPopup.vue b/src/components/FormModelPopup.vue
index 672eeff7a..85943e91e 100644
--- a/src/components/FormModelPopup.vue
+++ b/src/components/FormModelPopup.vue
@@ -1,12 +1,13 @@
diff --git a/src/pages/Customer/CustomerFilter.vue b/src/pages/Customer/CustomerFilter.vue
index 21de8fa9b..1c5a08304 100644
--- a/src/pages/Customer/CustomerFilter.vue
+++ b/src/pages/Customer/CustomerFilter.vue
@@ -143,6 +143,7 @@ const exprBuilder = (param, value) => {
outlined
rounded
auto-load
+ sortBy="name ASC"
/>
diff --git a/src/pages/Customer/CustomerList.vue b/src/pages/Customer/CustomerList.vue
index b8c1a743e..0bfca7910 100644
--- a/src/pages/Customer/CustomerList.vue
+++ b/src/pages/Customer/CustomerList.vue
@@ -78,10 +78,20 @@ const columns = computed(() => [
component: 'select',
attrs: {
url: 'Workers/activeWithInheritedRole',
- fields: ['id', 'name'],
+ fields: ['id', 'name', 'firstName'],
where: { role: 'salesPerson' },
optionFilter: 'firstName',
},
+ columnFilter: {
+ component: 'select',
+ attrs: {
+ url: 'Workers/activeWithInheritedRole',
+ fields: ['id', 'name', 'firstName'],
+ where: { role: 'salesPerson' },
+ optionLabel: 'firstName',
+ optionValue: 'id',
+ },
+ },
create: false,
columnField: {
component: null,
diff --git a/src/pages/Customer/components/CustomerSamplesCreate.vue b/src/pages/Customer/components/CustomerSamplesCreate.vue
index 8d241441d..1294a5d25 100644
--- a/src/pages/Customer/components/CustomerSamplesCreate.vue
+++ b/src/pages/Customer/components/CustomerSamplesCreate.vue
@@ -18,6 +18,7 @@ import VnInput from 'src/components/common/VnInput.vue';
import VnInputDate from 'src/components/common/VnInputDate.vue';
import CustomerSamplesPreview from 'src/pages/Customer/components/CustomerSamplesPreview.vue';
import FormPopup from 'src/components/FormPopup.vue';
+import { useArrayData } from 'src/composables/useArrayData';
const { dialogRef, onDialogOK } = useDialogPluginComponent();
@@ -39,7 +40,7 @@ const optionsSamplesVisible = ref([]);
const sampleType = ref({ hasPreview: false });
const initialData = reactive({});
const entityId = computed(() => route.params.id);
-const customer = computed(() => state.get('Customer'));
+const customer = computed(() => useArrayData('Customer').store?.data);
const filterEmailUsers = { where: { userFk: user.value.id } };
const filterClientsAddresses = {
include: [
@@ -65,9 +66,9 @@ const filterSamplesVisible = {
defineEmits(['confirm', ...useDialogPluginComponent.emits]);
onBeforeMount(async () => {
- initialData.clientFk = customer.value.id;
- initialData.recipient = customer.value.email;
- initialData.recipientId = customer.value.id;
+ initialData.clientFk = customer.value?.id;
+ initialData.recipient = customer.value?.email;
+ initialData.recipientId = customer.value?.id;
});
const setEmailUser = (data) => {
diff --git a/src/pages/Item/Card/ItemDiary.vue b/src/pages/Item/Card/ItemDiary.vue
index 4b6775183..31b3c328e 100644
--- a/src/pages/Item/Card/ItemDiary.vue
+++ b/src/pages/Item/Card/ItemDiary.vue
@@ -27,7 +27,7 @@ const user = state.getUser();
const today = Date.vnNew();
today.setHours(0, 0, 0, 0);
const warehousesOptions = ref([]);
-const itemBalances = computed(() => arrayDataItemBalances.store.data);
+const itemBalances = computed(() => arrayDataItemBalances.store.data || []);
const where = computed(() => arrayDataItemBalances.store.filter.where || {});
const showWhatsBeforeInventory = ref(false);
const inventoriedDate = ref(null);
@@ -313,8 +313,8 @@ async function updateWarehouse(warehouseFk) {
row.lineFk == row.lastPreparedLineFk
? 'black'
: row.balance < 0
- ? 'negative'
- : ''
+ ? 'negative'
+ : ''
"
dense
style="font-size: 14px"
diff --git a/src/pages/Item/Card/ItemTags.vue b/src/pages/Item/Card/ItemTags.vue
index ed23ab5a6..ab26b9cae 100644
--- a/src/pages/Item/Card/ItemTags.vue
+++ b/src/pages/Item/Card/ItemTags.vue
@@ -87,7 +87,7 @@ const insertTag = (rows) => {
tagFk: undefined,
}"
:default-remove="false"
- :filter="{
+ :user-filter="{
fields: ['id', 'itemFk', 'tagFk', 'value', 'priority'],
where: { itemFk: route.params.id },
include: {
@@ -119,6 +119,7 @@ const insertTag = (rows) => {
"
:required="true"
:rules="validate('itemTag.tagFk')"
+ :data-cy="`tag${row?.tag?.name}`"
/>
{
:label="t('itemTags.value')"
:is-clearable="false"
@keyup.enter.stop="(data) => itemTagsRef.onSubmit(data)"
+ :data-cy="`tag${row?.tag?.name}Value`"
/>
{
name="delete"
size="sm"
dense
+ :data-cy="`deleteTag${row?.tag?.name}`"
>
{{ t('itemTags.removeTag') }}
@@ -177,6 +180,7 @@ const insertTag = (rows) => {
icon="add"
v-shortcut="'+'"
fab
+ data-cy="createNewTag"
>
{{ t('itemTags.addTag') }}
diff --git a/src/pages/Ticket/Card/TicketSale.vue b/src/pages/Ticket/Card/TicketSale.vue
index e680fb290..6f02a2ce6 100644
--- a/src/pages/Ticket/Card/TicketSale.vue
+++ b/src/pages/Ticket/Card/TicketSale.vue
@@ -175,17 +175,21 @@ const getSaleTotal = (sale) => {
return price - discount;
};
+const getRowUpdateInputEvents = (sale) => ({
+ 'keyup.enter': () => {
+ changeQuantity(sale);
+ },
+ blur: () => {
+ changeQuantity(sale);
+ },
+});
+
const resetChanges = async () => {
arrayData.fetch({ append: false });
tableRef.value.reload();
};
-const rowToUpdate = ref(null);
const changeQuantity = async (sale) => {
- if (
- !sale.itemFk ||
- sale.quantity == null ||
- edit.value?.oldQuantity === sale.quantity
- )
+ if (!sale.itemFk || sale.quantity == null || sale?.originalQuantity === sale.quantity)
return;
if (!sale.id) return addSale(sale);
@@ -197,11 +201,8 @@ const changeQuantity = async (sale) => {
const updateQuantity = async (sale) => {
try {
let { quantity, id } = sale;
- if (!rowToUpdate.value) return;
- rowToUpdate.value = null;
sale.isNew = false;
- const params = { quantity: quantity };
- await axios.post(`Sales/${id}/updateQuantity`, params);
+ await axios.post(`Sales/${id}/updateQuantity`, { quantity });
notify('globals.dataSaved', 'positive');
tableRef.value.reload();
} catch (e) {
@@ -772,9 +773,7 @@ watch(
v-if="row.isNew || isTicketEditable"
type="number"
v-model.number="row.quantity"
- @blur="changeQuantity(row)"
- @keyup.enter.stop="changeQuantity(row)"
- @update:model-value="() => (rowToUpdate = row)"
+ v-on="getRowUpdateInputEvents(row)"
@focus="edit.oldQuantity = row.quantity"
/>
{{ row.quantity }}
diff --git a/src/pages/Ticket/Card/TicketSaleMoreActions.vue b/src/pages/Ticket/Card/TicketSaleMoreActions.vue
index 4cc96e9e2..8b5537edc 100644
--- a/src/pages/Ticket/Card/TicketSaleMoreActions.vue
+++ b/src/pages/Ticket/Card/TicketSaleMoreActions.vue
@@ -50,6 +50,7 @@ const { dialog } = useQuasar();
const { notify } = useNotify();
const acl = useAcl();
const btnDropdownRef = ref(null);
+const editManaProxyRef = ref(null);
const { openConfirmationModal } = useVnConfirm();
const newDiscount = ref(null);
@@ -131,13 +132,13 @@ const createClaim = () => {
openConfirmationModal(
t('Claim out of time'),
t('Do you want to continue?'),
- onCreateClaimAccepted
+ onCreateClaimAccepted,
);
else
openConfirmationModal(
t('Do you want to create a claim?'),
false,
- onCreateClaimAccepted
+ onCreateClaimAccepted,
);
};
@@ -216,8 +217,15 @@ const createRefund = async (withWarehouse) => {
{{ t('Update discount') }}
-
+
editManaProxyRef.save(row)"
v-model.number="newDiscount"
:label="t('ticketSale.discount')"
type="number"
diff --git a/src/pages/Ticket/Card/TicketSummary.vue b/src/pages/Ticket/Card/TicketSummary.vue
index 5df08b881..5838efa88 100644
--- a/src/pages/Ticket/Card/TicketSummary.vue
+++ b/src/pages/Ticket/Card/TicketSummary.vue
@@ -46,6 +46,15 @@ const descriptorData = useArrayData('Ticket');
onMounted(async () => {
ticketUrl.value = (await getUrl('ticket/')) + entityId.value + '/';
});
+const formattedAddress = computed(() => {
+ if (!ticket.value) return '';
+
+ const address = ticket.value.address;
+ const postcode = address.postalCode;
+ const province = address.province ? `(${address.province.name})` : '';
+
+ return `${address.street} - ${postcode} - ${address.city} ${province}`;
+});
function isEditable() {
try {
@@ -238,7 +247,7 @@ onMounted(async () => {
/>
diff --git a/src/pages/Ticket/TicketFilter.vue b/src/pages/Ticket/TicketFilter.vue
index 4b50892b0..c82c0067f 100644
--- a/src/pages/Ticket/TicketFilter.vue
+++ b/src/pages/Ticket/TicketFilter.vue
@@ -293,6 +293,7 @@ en:
clientFk: Customer
orderFk: Order
from: From
+ shipped: Shipped
to: To
salesPersonFk: Salesperson
stateFk: State
@@ -320,6 +321,7 @@ es:
clientFk: Cliente
orderFk: Pedido
from: Desde
+ shipped: F. envĂo
to: Hasta
salesPersonFk: Comercial
stateFk: Estado
diff --git a/src/pages/Ticket/TicketList.vue b/src/pages/Ticket/TicketList.vue
index 88878076d..78bebc297 100644
--- a/src/pages/Ticket/TicketList.vue
+++ b/src/pages/Ticket/TicketList.vue
@@ -108,13 +108,11 @@ const columns = computed(() => [
},
{
align: 'left',
- name: 'shippedDate',
+ name: 'shipped',
cardVisible: true,
label: t('ticketList.shipped'),
columnFilter: {
component: 'date',
- alias: 't',
- inWhere: true,
},
format: ({ shippedDate }) => toDate(shippedDate),
},
diff --git a/test/cypress/integration/claim/claimAction.spec.js b/test/cypress/integration/claim/claimAction.spec.js
index e98be85fc..b0a16a2ad 100644
--- a/test/cypress/integration/claim/claimAction.spec.js
+++ b/test/cypress/integration/claim/claimAction.spec.js
@@ -1,6 +1,6 @@
///
describe('ClaimAction', () => {
- const claimId = 2;
+ const claimId = 1;
const firstRow = 'tbody > :nth-child(1)';
const destinationRow = '.q-item__section > .q-field';
diff --git a/test/cypress/integration/item/itemTag.spec.js b/test/cypress/integration/item/itemTag.spec.js
index d7a9ea4b3..425eaffe6 100644
--- a/test/cypress/integration/item/itemTag.spec.js
+++ b/test/cypress/integration/item/itemTag.spec.js
@@ -1,4 +1,3 @@
-///
describe('Item tag', () => {
beforeEach(() => {
cy.viewport(1920, 1080);
@@ -8,25 +7,27 @@ describe('Item tag', () => {
cy.waitForElement('[data-cy="itemTags"]');
});
+ const createNewTag = 'createNewTag';
+ const saveBtn = 'crudModelDefaultSaveBtn';
+ const newTag = 'tagundefined';
+
it('should throw an error adding an existent tag', () => {
- cy.get('.q-page-sticky > div').click();
- cy.selectOption(':nth-child(8) > .q-select', 'Tallos');
- cy.get(':nth-child(8) > [label="Value"]').type('1');
- cy.dataCy('crudModelDefaultSaveBtn').click();
+ cy.dataCy(createNewTag).click();
+ cy.dataCy(newTag).should('be.visible').click().type('Genero{enter}');
+ cy.dataCy('tagGeneroValue').eq(1).should('be.visible');
+ cy.dataCy(saveBtn).click();
cy.checkNotification("The tag or priority can't be repeated for an item");
});
it('should add a new tag', () => {
- cy.get('.q-page-sticky > div').click();
- cy.selectOption(':nth-child(8) > .q-select', 'Ancho de la base');
- cy.get(':nth-child(8) > [label="Value"]').type('50');
- cy.dataCy('crudModelDefaultSaveBtn').click();
+ cy.dataCy(createNewTag).click();
+ cy.dataCy(newTag).should('be.visible').click().type('Forma{enter}');
+ cy.dataCy('tagFormaValue').should('be.visible').type('50');
+ cy.dataCy(saveBtn).click();
+
cy.checkNotification('Data saved');
- cy.dataCy('itemTags')
- .children(':nth-child(8)')
- .find('.justify-center > .q-icon')
- .click();
- cy.dataCy('VnConfirm_confirm').click();
+ cy.dataCy('deleteTagForma').should('be.visible').click();
+ cy.dataCy('VnConfirm_confirm').should('be.visible').click();
cy.checkNotification('Data saved');
});
});