diff --git a/src/components/ui/VnLinkPhone.vue b/src/components/ui/VnLinkPhone.vue
index 4c045968f..c5d5df394 100644
--- a/src/components/ui/VnLinkPhone.vue
+++ b/src/components/ui/VnLinkPhone.vue
@@ -1,22 +1,28 @@
{{ capitalize(type).replace('-', '') }}
diff --git a/src/components/ui/VnNotes.vue b/src/components/ui/VnNotes.vue
index dbcb2f3fe..bcbf0945e 100644
--- a/src/components/ui/VnNotes.vue
+++ b/src/components/ui/VnNotes.vue
@@ -101,6 +101,7 @@ onBeforeRouteLeave((to, from, next) => {
@click="insert"
class="q-mb-xs"
dense
+ data-cy="saveNote"
/>
diff --git a/src/components/ui/VnPaginate.vue b/src/components/ui/VnPaginate.vue
index f3f6d64f1..3649ba8f5 100644
--- a/src/components/ui/VnPaginate.vue
+++ b/src/components/ui/VnPaginate.vue
@@ -133,7 +133,7 @@ const addFilter = async (filter, params) => {
async function fetch(params) {
useArrayData(props.dataKey, params);
arrayData.reset(['filter.skip', 'skip', 'page']);
- await arrayData.fetch({ append: false });
+ await arrayData.fetch({ append: false, updateRouter: mounted.value });
return emitStoreData();
}
diff --git a/src/composables/useRequired.js b/src/composables/useRequired.js
index e650c91f5..d211b96b4 100644
--- a/src/composables/useRequired.js
+++ b/src/composables/useRequired.js
@@ -2,8 +2,14 @@ import { useValidator } from 'src/composables/useValidator';
export function useRequired($attrs) {
const { validations } = useValidator();
-
- const isRequired = Object.keys($attrs).includes('required');
+ const hasRequired = Object.keys($attrs).includes('required');
+ let isRequired = false;
+ if (hasRequired) {
+ const required = $attrs['required'];
+ if (typeof required === 'boolean') {
+ isRequired = required;
+ }
+ }
const requiredFieldRule = (val) => validations().required(isRequired, val);
return {
diff --git a/src/filters/getDifferences.js b/src/filters/getDifferences.js
new file mode 100644
index 000000000..3e1061aba
--- /dev/null
+++ b/src/filters/getDifferences.js
@@ -0,0 +1,21 @@
+export default function getDifferences(obj1, obj2) {
+ let diff = {};
+ delete obj1.$index;
+ delete obj2.$index;
+
+ for (let key in obj1) {
+ if (obj2[key] && JSON.stringify(obj1[key]) !== JSON.stringify(obj2[key])) {
+ diff[key] = obj2[key];
+ }
+ }
+ for (let key in obj2) {
+ if (
+ obj1[key] === undefined ||
+ JSON.stringify(obj1[key]) !== JSON.stringify(obj2[key])
+ ) {
+ diff[key] = obj2[key];
+ }
+ }
+
+ return diff;
+}
diff --git a/src/filters/getUpdatedValues.js b/src/filters/getUpdatedValues.js
new file mode 100644
index 000000000..5b9622fd0
--- /dev/null
+++ b/src/filters/getUpdatedValues.js
@@ -0,0 +1,6 @@
+export default function getUpdatedValues(keys, formData) {
+ return keys.reduce((acc, key) => {
+ acc[key] = formData[key];
+ return acc;
+ }, {});
+}
diff --git a/src/filters/index.js b/src/filters/index.js
index ce5c44706..a92d2eb07 100644
--- a/src/filters/index.js
+++ b/src/filters/index.js
@@ -11,11 +11,17 @@ import dashIfEmpty from './dashIfEmpty';
import dateRange from './dateRange';
import toHour from './toHour';
import dashOrCurrency from './dashOrCurrency';
+import getDifferences from './getDifferences';
+import getUpdatedValues from './getUpdatedValues';
import getParamWhere from './getParamWhere';
+import parsePhone from './parsePhone';
import isDialogOpened from './isDialogOpened';
export {
+ getUpdatedValues,
+ getDifferences,
isDialogOpened,
+ parsePhone,
toLowerCase,
toLowerCamel,
toDate,
diff --git a/src/filters/parsePhone.js b/src/filters/parsePhone.js
new file mode 100644
index 000000000..6cb1bea17
--- /dev/null
+++ b/src/filters/parsePhone.js
@@ -0,0 +1,18 @@
+import axios from 'axios';
+
+export default async function parsePhone(phone, country) {
+ if (!phone) return;
+ if (phone.startsWith('+')) return `${phone.slice(1)}`;
+ if (phone.startsWith('00')) return `${phone.slice(2)}`;
+
+ let prefix;
+ try {
+ prefix = (await axios.get(`Prefixes/${country.toLowerCase()}`)).data?.prefix;
+ } catch (e) {
+ prefix = (await axios.get('PbxConfigs/findOne')).data?.defaultPrefix;
+ }
+ prefix = prefix.replace(/^0+/, '');
+
+ if (phone.startsWith(prefix)) return phone;
+ return `${prefix}${phone}`;
+}
diff --git a/src/i18n/locale/en.yml b/src/i18n/locale/en.yml
index 3a560fc85..b4765a20d 100644
--- a/src/i18n/locale/en.yml
+++ b/src/i18n/locale/en.yml
@@ -60,7 +60,7 @@ globals:
reference: Reference
agency: Agency
warehouseOut: Warehouse Out
- wareHouseIn: Warehouse In
+ warehouseIn: Warehouse In
landed: Landed
shipped: Shipped
totalEntries: Total entries
@@ -769,7 +769,7 @@ travel:
thermographs: Thermographs
hb: HB
basicData:
- daysInForward: Days in forward
+ daysInForward: Automatic movement (Raid)
isRaid: Raid
thermographs:
temperature: Temperature
diff --git a/src/i18n/locale/es.yml b/src/i18n/locale/es.yml
index b33d6ff42..be2b76a06 100644
--- a/src/i18n/locale/es.yml
+++ b/src/i18n/locale/es.yml
@@ -763,7 +763,7 @@ travel:
thermographs: Termógrafos
hb: HB
basicData:
- daysInForward: Días redada
+ daysInForward: Desplazamiento automatico (redada)
isRaid: Redada
thermographs:
temperature: Temperatura
diff --git a/src/pages/Account/Card/AccountMailForwarding.vue b/src/pages/Account/Card/AccountMailForwarding.vue
index aa92e5072..30849d44a 100644
--- a/src/pages/Account/Card/AccountMailForwarding.vue
+++ b/src/pages/Account/Card/AccountMailForwarding.vue
@@ -41,8 +41,12 @@ const fetchAccountExistence = async () => {
};
const fetchMailForwards = async () => {
- const response = await axios.get(`MailForwards/${route.params.id}`);
- return response.data;
+ try {
+ const response = await axios.get(`MailForwards/${route.params.id}`);
+ return response.data;
+ } catch {
+ return null;
+ }
};
const deleteMailForward = async () => {
diff --git a/src/pages/Customer/Card/CustomerAddress.vue b/src/pages/Customer/Card/CustomerAddress.vue
index 5e896c84f..657cc7ae7 100644
--- a/src/pages/Customer/Card/CustomerAddress.vue
+++ b/src/pages/Customer/Card/CustomerAddress.vue
@@ -2,6 +2,7 @@
import { onBeforeMount, ref, watch } from 'vue';
import { useI18n } from 'vue-i18n';
import { useRoute, useRouter } from 'vue-router';
+import FetchData from 'components/FetchData.vue';
import axios from 'axios';
@@ -52,7 +53,6 @@ const addressFilter = {
onBeforeMount(() => {
const { id } = route.params;
- getAddressesData(id);
getClientData(id);
});
@@ -60,23 +60,10 @@ watch(
() => route.params.id,
(newValue) => {
if (!newValue) return;
- getAddressesData(newValue);
getClientData(newValue);
}
);
-const getAddressesData = async (id) => {
- try {
- const { data } = await axios.get(`Clients/${id}/addresses`, {
- params: { filter: JSON.stringify(addressFilter) },
- });
- addresses.value = data;
- sortAddresses();
- } catch (error) {
- return error;
- }
-};
-
const getClientData = async (id) => {
try {
const { data } = await axios.get(`Clients/${id}`);
@@ -101,9 +88,9 @@ const setDefault = (address) => {
});
};
-const sortAddresses = () => {
- if (!client.value || !addresses.value) return;
- addresses.value = addresses.value.sort((a, b) => {
+const sortAddresses = (data) => {
+ if (!client.value || !data) return;
+ addresses.value = data.sort((a, b) => {
return isDefaultAddress(b) - isDefaultAddress(a);
});
};
@@ -124,8 +111,17 @@ const toCustomerAddressEdit = (addressId) => {
+
-
+
{
and: [{ active: { neq: false } }, handleSalesModelValue(value)],
};
};
+
+function onBeforeSave(formData, originalData) {
+ return getUpdatedValues(
+ Object.keys(getDifferences(formData, originalData)),
+ formData
+ );
+}
{
@on-fetch="(data) => (businessTypes = data)"
auto-load
/>
-
+
{
clearable
type="number"
v-model="data.phone"
+ data-cy="customerPhone"
/>
{
url="Clients"
:input-debounce="0"
:label="t('customer.basicData.previousClient')"
- :options="clients"
:rules="validate('client.transferorFk')"
emit-value
map-options
diff --git a/src/pages/Customer/Card/CustomerBillingData.vue b/src/pages/Customer/Card/CustomerBillingData.vue
index a968d0ec8..48f729e29 100644
--- a/src/pages/Customer/Card/CustomerBillingData.vue
+++ b/src/pages/Customer/Card/CustomerBillingData.vue
@@ -28,12 +28,7 @@ const getBankEntities = (data, formData) => {
-
+
[
-
diff --git a/src/pages/Customer/Card/CustomerDescriptor.vue b/src/pages/Customer/Card/CustomerDescriptor.vue
index 0753bee9e..98e53d568 100644
--- a/src/pages/Customer/Card/CustomerDescriptor.vue
+++ b/src/pages/Customer/Card/CustomerDescriptor.vue
@@ -36,7 +36,10 @@ const entityId = computed(() => {
});
const data = ref(useCardDescription());
-const setData = (entity) => (data.value = useCardDescription(entity?.name, entity?.id));
+const setData = (entity) => {
+ data.value = useCardDescription(entity?.name, entity?.id);
+ if (customer.value) customer.value.webAccess = data.value?.account?.isActive;
+};
const debtWarning = computed(() => {
return customer.value?.debt > customer.value?.credit ? 'negative' : 'primary';
});
diff --git a/src/pages/Customer/Card/CustomerFiscalData.vue b/src/pages/Customer/Card/CustomerFiscalData.vue
index 6c5086149..673c7dda9 100644
--- a/src/pages/Customer/Card/CustomerFiscalData.vue
+++ b/src/pages/Customer/Card/CustomerFiscalData.vue
@@ -34,7 +34,6 @@ function handleLocation(data, location) {
/>
@@ -68,6 +67,7 @@ function handleLocation(data, location) {
option-label="vat"
option-value="id"
v-model="data.sageTaxTypeFk"
+ data-cy="sageTaxTypeFk"
:required="data.isTaxDataChecked"
/>
diff --git a/src/pages/Customer/Card/CustomerSummary.vue b/src/pages/Customer/Card/CustomerSummary.vue
index 4fa7b9bdc..2cad13115 100644
--- a/src/pages/Customer/Card/CustomerSummary.vue
+++ b/src/pages/Customer/Card/CustomerSummary.vue
@@ -95,6 +95,7 @@ const sumRisk = ({ clientRisks }) => {
:phone-number="entity.mobile"
:channel="entity.country?.saySimpleCountry?.channel"
class="q-ml-xs"
+ :country="entity.country?.code"
/>
diff --git a/src/pages/Customer/Card/CustomerUnpaid.vue b/src/pages/Customer/Card/CustomerUnpaid.vue
index ef3ff3b94..18b12c60c 100644
--- a/src/pages/Customer/Card/CustomerUnpaid.vue
+++ b/src/pages/Customer/Card/CustomerUnpaid.vue
@@ -1,164 +1,82 @@
-
-
-
-
-
-
-
-
-
-
+ {
+ const unpaid = data.length == 1;
+ initialData = { ...data[0], unpaid };
+ }
+ "
+ />
+
+
+
-
-
-
+
-
+
-
+
-
- €€
-
-
-
+
+
+
diff --git a/src/pages/Customer/Card/CustomerWebAccess.vue b/src/pages/Customer/Card/CustomerWebAccess.vue
index 1db32c752..ea901c65a 100644
--- a/src/pages/Customer/Card/CustomerWebAccess.vue
+++ b/src/pages/Customer/Card/CustomerWebAccess.vue
@@ -25,10 +25,9 @@ async function hasCustomerRole() {
-
-
+
+
diff --git a/src/pages/Customer/Card/CustomerWebPayment.vue b/src/pages/Customer/Card/CustomerWebPayment.vue
index 482582078..0e2e690cc 100644
--- a/src/pages/Customer/Card/CustomerWebPayment.vue
+++ b/src/pages/Customer/Card/CustomerWebPayment.vue
@@ -1,9 +1,9 @@
-
-
-
-
-
-
-
- {{ props.value }}
-
-
-
-
-
+ (rows = data)"
+ auto-load
+ url="Clients/transactions"
+ />
+
+
+
+
+
+
+ {{ props.value }}
+
+
+
+
+
-
- {{ t('globals.noResults') }}
-
-
-
+
+ {{ t('globals.noResults') }}
+
+
diff --git a/src/pages/Customer/CustomerFilter.vue b/src/pages/Customer/CustomerFilter.vue
index 79d48a667..cd567d415 100644
--- a/src/pages/Customer/CustomerFilter.vue
+++ b/src/pages/Customer/CustomerFilter.vue
@@ -101,8 +101,8 @@ const exprBuilder = (param, value) => {
-
+ {
/>
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{
outlined
rounded
auto-load
+ />
+
+
+
+
-
-
-
-
-
-
-
+
+
@@ -203,7 +201,6 @@ es:
Salesperson: Comercial
Province: Provincia
City: Ciudad
- More options: Más opciones
Phone: Teléfono
Email: Email
Zone: Zona
diff --git a/src/pages/Customer/CustomerList.vue b/src/pages/Customer/CustomerList.vue
index 3cb17332c..865287aeb 100644
--- a/src/pages/Customer/CustomerList.vue
+++ b/src/pages/Customer/CustomerList.vue
@@ -12,6 +12,7 @@ import RightMenu from 'src/components/common/RightMenu.vue';
import VnLinkPhone from 'src/components/ui/VnLinkPhone.vue';
import { toDate } from 'src/filters';
import CustomerFilter from './CustomerFilter.vue';
+import VnAvatar from 'src/components/ui/VnAvatar.vue';
const { t } = useI18n();
const router = useRouter();
diff --git a/src/pages/Customer/components/CustomerAddressCreate.vue b/src/pages/Customer/components/CustomerAddressCreate.vue
index e3fef8e5f..bc4d6a128 100644
--- a/src/pages/Customer/components/CustomerAddressCreate.vue
+++ b/src/pages/Customer/components/CustomerAddressCreate.vue
@@ -1,9 +1,8 @@
+ (customsAgents = data)"
+ auto-load
+ url="CustomsAgents"
+ />
(agencyModes = data)"
auto-load
@@ -67,7 +60,7 @@ function handleLocation(data, location) {
@@ -139,6 +132,7 @@ function handleLocation(data, location) {
/>
-
+ onAgentCreated(requestResponse, data)
+ "
+ />
diff --git a/src/pages/Customer/components/CustomerAddressEdit.vue b/src/pages/Customer/components/CustomerAddressEdit.vue
index 0ea8315d6..c32fa6630 100644
--- a/src/pages/Customer/components/CustomerAddressEdit.vue
+++ b/src/pages/Customer/components/CustomerAddressEdit.vue
@@ -144,7 +144,7 @@ function handleLocation(data, location) {
:url="`Addresses/${route.params.addressId}`"
@on-data-saved="onDataSaved()"
auto-load
- model="client"
+ model="customer"
>
[
@@ -126,7 +126,9 @@ const entriesTableColumns = computed(() => [
"
unelevated
>
- {{ t('viewLabel') }}
+ {{
+ t('myEntries.viewLabel')
+ }}
diff --git a/src/pages/Entry/MyEntries.vue b/src/pages/Entry/MyEntries.vue
index 2c37c2c42..91a29b190 100644
--- a/src/pages/Entry/MyEntries.vue
+++ b/src/pages/Entry/MyEntries.vue
@@ -101,7 +101,7 @@ const columns = computed(() => [
name: 'tableActions',
actions: [
{
- title: t('printLabels'),
+ title: t('myEntries.printLabels'),
icon: 'print',
isPrimary: true,
action: (row) => printBuys(row.id),
diff --git a/src/pages/InvoiceIn/InvoiceInFilter.vue b/src/pages/InvoiceIn/InvoiceInFilter.vue
index d1c0856b5..130a77960 100644
--- a/src/pages/InvoiceIn/InvoiceInFilter.vue
+++ b/src/pages/InvoiceIn/InvoiceInFilter.vue
@@ -184,5 +184,4 @@ es:
Amount: Importe
Issued: Fecha factura
Id or supplier: Id o proveedor
- More options: Más opciones
diff --git a/src/pages/InvoiceOut/InvoiceOutFilter.vue b/src/pages/InvoiceOut/InvoiceOutFilter.vue
index 9ce8cc254..dc1d833a2 100644
--- a/src/pages/InvoiceOut/InvoiceOutFilter.vue
+++ b/src/pages/InvoiceOut/InvoiceOutFilter.vue
@@ -83,36 +83,29 @@ const states = ref();
/>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -149,5 +142,4 @@ es:
Issued: Fecha emisión
Created: Fecha creación
Dued: Fecha vencimiento
- More options: Más opciones
diff --git a/src/pages/InvoiceOut/InvoiceOutList.vue b/src/pages/InvoiceOut/InvoiceOutList.vue
index 8edb78732..c8fffb0ef 100644
--- a/src/pages/InvoiceOut/InvoiceOutList.vue
+++ b/src/pages/InvoiceOut/InvoiceOutList.vue
@@ -60,8 +60,15 @@ const columns = computed(() => [
label: t('globals.reference'),
isTitle: true,
component: 'select',
- attrs: { url: MODEL, optionLabel: 'ref', optionValue: 'id' },
+ attrs: {
+ url: MODEL,
+ optionLabel: 'ref',
+ optionValue: 'ref',
+ },
columnField: { component: null },
+ columnFilter: {
+ inWhere: true,
+ },
},
{
align: 'left',
@@ -139,25 +146,22 @@ function openPdf(id) {
}
function downloadPdf() {
- if (selectedRows.value.size === 0) return;
- const selectedCardsArray = Array.from(selectedRows.value.values());
+ if (selectedRows.value.size === 0) return;
+ const selectedCardsArray = Array.from(selectedRows.value.values());
- if (selectedRows.value.size === 1) {
- const [invoiceOut] = selectedCardsArray;
- openPdf(invoiceOut.id);
- } else {
- const invoiceOutIdsArray = selectedCardsArray.map(
- (invoiceOut) => invoiceOut.id
- );
- const invoiceOutIds = invoiceOutIdsArray.join(',');
+ if (selectedRows.value.size === 1) {
+ const [invoiceOut] = selectedCardsArray;
+ openPdf(invoiceOut.id);
+ } else {
+ const invoiceOutIdsArray = selectedCardsArray.map((invoiceOut) => invoiceOut.id);
+ const invoiceOutIds = invoiceOutIdsArray.join(',');
- const params = {
- ids: invoiceOutIds,
- };
-
- openReport(`${MODEL}/downloadZip`, params);
- }
+ const params = {
+ ids: invoiceOutIds,
+ };
+ openReport(`${MODEL}/downloadZip`, params);
+ }
}
watchEffect(selectedRows);
diff --git a/src/pages/Item/Card/ItemTags.vue b/src/pages/Item/Card/ItemTags.vue
index 461aaef4b..a077c72c6 100644
--- a/src/pages/Item/Card/ItemTags.vue
+++ b/src/pages/Item/Card/ItemTags.vue
@@ -66,6 +66,7 @@ const insertTag = (rows) => {
(tagOptions = data)"
auto-load
/>
@@ -137,6 +138,7 @@ const insertTag = (rows) => {
:required="false"
:rules="validate('itemTag.tagFk')"
:use-like="false"
+ sort-by="value"
/>
diff --git a/src/pages/Monitor/Ticket/MonitorTickets.vue b/src/pages/Monitor/Ticket/MonitorTickets.vue
index fa9d74406..e5fea3003 100644
--- a/src/pages/Monitor/Ticket/MonitorTickets.vue
+++ b/src/pages/Monitor/Ticket/MonitorTickets.vue
@@ -25,11 +25,8 @@ const provinceOpts = ref([]);
const stateOpts = ref([]);
const zoneOpts = ref([]);
const { viewSummary } = useSummaryDialog();
-const from = Date.vnNew();
-from.setHours(0, 0, 0, 0);
-const to = new Date(from.getTime());
-to.setDate(to.getDate() + 1);
-to.setHours(23, 59, 59, 999);
+
+const [from, to] = dateRange(Date.vnNew());
const stateColors = {
notice: 'info',
success: 'positive',
@@ -340,7 +337,7 @@ const openTab = (id) =>
auto-load
:row-click="({ id }) => openTab(id)"
:disable-option="{ card: true }"
- :user-params="{ from, to, scopeDays: 1 }"
+ :user-params="{ from, to, scopeDays: 0 }"
>
{
const filter = {
fields: ['value'],
order: 'value ASC',
- limit: 30,
};
const url = `Tags/${tag?.id}/filterValue`;
@@ -50,7 +49,7 @@ const getSelectedTagValues = async (tag) => {
-
+
{
:emit-value="false"
use-input
@update:model-value="getSelectedTagValues"
+ data-cy="catalogFilterValueDialogTagSelect"
/>
{
:disable="!value"
is-outlined
class="col"
+ data-cy="catalogFilterValueDialogValueInput"
/>
-
+
diff --git a/src/pages/Order/Card/OrderCatalogFilter.vue b/src/pages/Order/Card/OrderCatalogFilter.vue
index 6202a6f90..1dd569fb5 100644
--- a/src/pages/Order/Card/OrderCatalogFilter.vue
+++ b/src/pages/Order/Card/OrderCatalogFilter.vue
@@ -178,6 +178,7 @@ function addOrder(value, field, params) {
? resetCategory(params, searchFn)
: removeTagGroupParam(params, searchFn, valIndex)
"
+ data-cy="catalogFilterCustomTag"
>
{{
@@ -211,6 +212,7 @@ function addOrder(value, field, params) {
:name="category.icon"
class="category-icon"
@click="selectCategory(params, category, searchFn)"
+ data-cy="catalogFilterCategory"
>
{{ t(category.name) }}
@@ -234,6 +236,7 @@ function addOrder(value, field, params) {
sort-by="name ASC"
:disable="!params.categoryFk"
@update:model-value="searchFn()"
+ data-cy="catalogFilterType"
>
@@ -285,6 +288,7 @@ function addOrder(value, field, params) {
:is-clearable="false"
v-model="searchByTag"
@keyup.enter="(val) => onSearchByTag(val, params)"
+ data-cy="catalogFilterValueInput"
>
@@ -297,6 +301,7 @@ function addOrder(value, field, params) {
color="primary"
size="md"
dense
+ data-cy="catalogFilterValueDialogBtn"
/>
{
});
async function fetchClientAddress(id, formData = {}) {
const { data } = await axios.get(`Clients/${id}`, {
- params: { filter: { include: { relation: 'addresses' } } },
+ params: {
+ filter: {
+ order: ['isDefaultAddress DESC', 'isActive DESC', 'nickname ASC'],
+ include: { relation: 'addresses' },
+ },
+ },
});
addressesList.value = data.addresses;
formData.addressId = data.defaultAddressFk;
@@ -162,7 +168,7 @@ async function fetchAgencies({ landed, addressId }) {
const { data } = await axios.get('Agencies/landsThatDay', {
params: { addressFk: addressId, landed },
});
- agencyList.value = data;
+ agencyList.value = dataByOrder(data, 'agencyMode ASC');
}
const getDateColor = (date) => {
@@ -191,7 +197,7 @@ const getDateColor = (date) => {
urlCreate: 'Orders/new',
title: t('module.cerateOrder'),
onDataSaved: (url) => {
- tableRef.redirect(`${url}/catalog`);
+ tableRef.redirect(`${url}/catalog`);
},
formInitialData: {
active: true,
@@ -253,22 +259,27 @@ const getDateColor = (date) => {
@update:model-value="() => fetchAgencies(data)"
>
-
+
+
+
+
-
- {{
- `${
- !scope.opt?.isActive
- ? t('basicData.inactive')
- : ''
- } `
- }}
- {{ scope.opt?.nickname }}: {{ scope.opt?.street }},
- {{ scope.opt?.city }}
+
+ {{ scope.opt.nickname }}
+
+
+ {{ `${scope.opt.street}, ${scope.opt.city}` }}
diff --git a/src/pages/Supplier/Card/SupplierAccounts.vue b/src/pages/Supplier/Card/SupplierAccounts.vue
index 428ab05c2..c2934830a 100644
--- a/src/pages/Supplier/Card/SupplierAccounts.vue
+++ b/src/pages/Supplier/Card/SupplierAccounts.vue
@@ -24,13 +24,14 @@ const supplier = ref(null);
const supplierAccountRef = ref(null);
const wireTransferFk = ref(null);
const bankEntitiesOptions = ref([]);
+const filteredBankEntitiesOptions = ref([]);
const onBankEntityCreated = async (dataSaved, rowData) => {
await bankEntitiesRef.value.fetch();
rowData.bankEntityFk = dataSaved.id;
};
-const onChangesSaved = () => {
+const onChangesSaved = async () => {
if (supplier.value.payMethodFk !== wireTransferFk.value)
quasar
.dialog({
@@ -55,12 +56,35 @@ const setWireTransfer = async () => {
await axios.patch(`Suppliers/${route.params.id}`, params);
notify('globals.dataSaved', 'positive');
};
+
+function findBankFk(value, row) {
+ row.bankEntityFk = null;
+ if (!value) return;
+
+ const bankEntityFk = bankEntitiesOptions.value.find((b) => b.id == value.slice(4, 8));
+ if (bankEntityFk) row.bankEntityFk = bankEntityFk.id;
+}
+
+function bankEntityFilter(val, update) {
+ update(() => {
+ const needle = val.toLowerCase();
+ filteredBankEntitiesOptions.value = bankEntitiesOptions.value.filter(
+ (bank) =>
+ bank.bic.toLowerCase().startsWith(needle) ||
+ bank.name.toLowerCase().includes(needle)
+ );
+ });
+}
(bankEntitiesOptions = data)"
+ @on-fetch="
+ (data) => {
+ (bankEntitiesOptions = data), (filteredBankEntitiesOptions = data);
+ }
+ "
auto-load
/>
{
findBankFk(value, row)"
:required="true"
>
@@ -109,7 +134,9 @@ const setWireTransfer = async () => {
bankEntityFilter(val, update)"
option-label="bic"
option-value="id"
hide-selected
diff --git a/src/pages/Supplier/SupplierList.vue b/src/pages/Supplier/SupplierList.vue
index 69f826201..a54012b34 100644
--- a/src/pages/Supplier/SupplierList.vue
+++ b/src/pages/Supplier/SupplierList.vue
@@ -124,8 +124,7 @@ const columns = computed(() => [
-en:
- Search suppliers: Search suppliers
-es:
+ es:
Search suppliers: Buscar proveedores
+ Create Supplier: Crear proveedor
diff --git a/src/pages/Ticket/Card/TicketComponents.vue b/src/pages/Ticket/Card/TicketComponents.vue
index f45bde2d1..b88dd89e8 100644
--- a/src/pages/Ticket/Card/TicketComponents.vue
+++ b/src/pages/Ticket/Card/TicketComponents.vue
@@ -321,10 +321,6 @@ onUnmounted(() => (stateStore.rightDrawer = false));
{{ toCurrency(saleComponent.value * row.quantity, 'EUR', 3) }}
-
diff --git a/src/pages/Ticket/Card/TicketDescriptorMenu.vue b/src/pages/Ticket/Card/TicketDescriptorMenu.vue
index b8e64cb79..60a703f84 100644
--- a/src/pages/Ticket/Card/TicketDescriptorMenu.vue
+++ b/src/pages/Ticket/Card/TicketDescriptorMenu.vue
@@ -676,7 +676,7 @@ async function uploadDocuware(force) {
@@ -741,7 +741,6 @@ es:
Ticket invoiced: Ticket facturado
Set weight: Establecer peso
Weight set: Peso establecido
- This ticket may be invoiced, do you want to continue?: Es posible que se facture este ticket, desea continuar?
invoiceIds: "Se han generado las facturas con los siguientes ids: {invoiceIds}"
This ticket will be removed from current route! Continue anyway?: ¡Se eliminará el ticket de la ruta actual! ¿Continuar de todas formas?
You are going to delete this ticket: Vas a eliminar este ticket
diff --git a/src/pages/Ticket/Card/TicketSale.vue b/src/pages/Ticket/Card/TicketSale.vue
index 67787228f..b534170c9 100644
--- a/src/pages/Ticket/Card/TicketSale.vue
+++ b/src/pages/Ticket/Card/TicketSale.vue
@@ -181,20 +181,44 @@ const resetChanges = async () => {
arrayData.fetch({ append: false });
tableRef.value.reload();
};
+const rowToUpdate = ref(null);
+const changeQuantity = async (sale) => {
+ canProceed.value = await isSalePrepared(sale);
+ if (!canProceed.value) return;
+ if (
+ !sale.itemFk ||
+ sale.quantity == null ||
+ edit.value?.oldQuantity === sale.quantity
+ )
+ return;
+ if (!sale.id) return addSale(sale);
-const updateQuantity = async (sale) => {
- const payload = { quantity: sale.quantity };
- await axios.post(`Sales/${sale.id}/updateQuantity`, payload);
+ try {
+ if (!rowToUpdate.value) return;
+ rowToUpdate.value = null;
+ await updateQuantity(sale);
+ } catch (e) {
+ const { quantity } = tableRef.value.CrudModelRef.originalData.find(
+ (s) => s.id === sale.id
+ );
+ sale.quantity = quantity;
+ throw e;
+ }
+};
+
+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 payload = {
+ const params = {
barcode: sale.itemFk,
quantity: sale.quantity,
};
- const { data } = await axios.post(`tickets/${route.params.id}/addSale`, payload);
+ const { data } = await axios.post(`tickets/${route.params.id}/addSale`, params);
if (!data) return;
@@ -212,19 +236,6 @@ const addSale = async (sale) => {
window.location.reload();
};
-const changeQuantity = async (sale) => {
- canProceed.value = await isSalePrepared(sale);
- if (!canProceed.value) return;
- if (
- !sale.itemFk ||
- sale.quantity == null ||
- edit.value?.oldQuantity === sale.quantity
- )
- return;
- if (!sale.id) return addSale(sale);
- updateQuantity(sale);
-};
-
const updateConcept = async (sale) => {
canProceed.value = await isSalePrepared(sale);
if (!canProceed.value) return;
@@ -771,16 +782,12 @@ watch(
- (rowToUpdate = row)"
@focus="edit.oldQuantity = row.quantity"
/>
{{ row.quantity }}
diff --git a/src/pages/Ticket/Card/TicketSaleTracking.vue b/src/pages/Ticket/Card/TicketSaleTracking.vue
index 03e2336eb..7a33df795 100644
--- a/src/pages/Ticket/Card/TicketSaleTracking.vue
+++ b/src/pages/Ticket/Card/TicketSaleTracking.vue
@@ -471,7 +471,7 @@ const qCheckBoxController = (sale, action) => {
url="Shelvings"
hide-selected
option-label="code"
- option-value="code"
+ option-value="id"
v-model="row.shelvingFk"
@update:model-value="updateShelving(row)"
style="max-width: 120px"
diff --git a/src/pages/Ticket/Card/TicketSummary.vue b/src/pages/Ticket/Card/TicketSummary.vue
index eeef65cd3..2f5f69e1c 100644
--- a/src/pages/Ticket/Card/TicketSummary.vue
+++ b/src/pages/Ticket/Card/TicketSummary.vue
@@ -258,7 +258,7 @@ function toTicketUrl(section) {
{
/>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -340,7 +337,6 @@ es:
With problems: Con problemas
Invoiced: Facturado
Routed: Enrutado
- More options: Más opciones
Province: Provincia
Agency: Agencia
Warehouse: Almacén
diff --git a/src/pages/Ticket/TicketList.vue b/src/pages/Ticket/TicketList.vue
index 149a794a9..2fe4fcddc 100644
--- a/src/pages/Ticket/TicketList.vue
+++ b/src/pages/Ticket/TicketList.vue
@@ -274,7 +274,7 @@ const fetchAddresses = async (formData) => {
const filter = {
fields: ['nickname', 'street', 'city', 'id', 'isActive'],
- order: 'nickname ASC',
+ order: ['isDefaultAddress DESC', 'isActive DESC', 'nickname ASC'],
};
const params = { filter: JSON.stringify(filter) };
const { data } = await axios.get(`Clients/${formData.clientId}/addresses`, {
@@ -590,7 +590,22 @@ function setReference(data) {
@update:model-value="() => fetchAvailableAgencies(data)"
>
-
+
+
+
+
(agenciesOptions = data)"
auto-load
/>
+ (warehousesOptionsOut = data)"
+ auto-load
+ :filter="{ where: { isOrigin: TRUE } }"
+ />
+ (warehousesOptionsIn = data)"
+ auto-load
+ :filter="{ where: { isDestiny: TRUE } }"
+ />
@@ -39,11 +53,12 @@ const agenciesOptions = ref([]);
+
es:
- raidDays: Si se marca "Redada", la fecha de entrega se moverá automáticamente los días indicados (incluido 0). Si se deja vacio, la fecha no cambiará
+ raidDays: El travel se desplaza automáticamente cada día para estar desde hoy al número de días indicado. Si se deja vacio no se moverá
en:
- raidDays: If "Raid" is checked, the landing date will automatically shift by the specified number of days (including 0). If left empty, the date will stay the same.
+ raidDays: The travel adjusts itself daily to match the number of days set, starting from today. If left blank, it won’t move
diff --git a/src/pages/Travel/Card/TravelCard.vue b/src/pages/Travel/Card/TravelCard.vue
index 50cecef34..fd442d58b 100644
--- a/src/pages/Travel/Card/TravelCard.vue
+++ b/src/pages/Travel/Card/TravelCard.vue
@@ -7,13 +7,13 @@ import filter from './TravelFilter.js';
diff --git a/src/pages/Travel/Card/TravelDescriptor.vue b/src/pages/Travel/Card/TravelDescriptor.vue
index 9d00d371a..00852e5ee 100644
--- a/src/pages/Travel/Card/TravelDescriptor.vue
+++ b/src/pages/Travel/Card/TravelDescriptor.vue
@@ -44,8 +44,8 @@ const setData = (entity) => (data.value = useCardDescription(entity.ref, entity.
-
-
+
+
diff --git a/src/pages/Travel/TravelList.vue b/src/pages/Travel/TravelList.vue
index 852003a95..0e69250a8 100644
--- a/src/pages/Travel/TravelList.vue
+++ b/src/pages/Travel/TravelList.vue
@@ -208,6 +208,7 @@ const columns = computed(() => [
ref="tableRef"
data-key="TravelList"
url="Travels/filter"
+ redirect="travel"
:create="{
urlCreate: 'Travels',
title: t('Create Travels'),
@@ -221,9 +222,7 @@ const columns = computed(() => [
order="landed DESC"
:columns="columns"
auto-load
- redirect="travel"
:is-editable="false"
- :use-model="true"
>
diff --git a/src/pages/Zone/Card/ZoneEventExclusionForm.vue b/src/pages/Zone/Card/ZoneEventExclusionForm.vue
index 4b54f6743..0882036c1 100644
--- a/src/pages/Zone/Card/ZoneEventExclusionForm.vue
+++ b/src/pages/Zone/Card/ZoneEventExclusionForm.vue
@@ -1,5 +1,5 @@