diff --git a/package.json b/package.json
index c638b6c32..9d14e8727 100644
--- a/package.json
+++ b/package.json
@@ -25,6 +25,7 @@
"axios": "^1.4.0",
"chromium": "^3.0.3",
"croppie": "^2.6.5",
+ "moment": "^2.30.1",
"pinia": "^2.1.3",
"quasar": "^2.14.5",
"validator": "^13.9.0",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 83dfa0469..7bf640347 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -20,6 +20,9 @@ dependencies:
croppie:
specifier: ^2.6.5
version: 2.6.5
+ moment:
+ specifier: ^2.30.1
+ version: 2.30.1
pinia:
specifier: ^2.1.3
version: 2.1.7(typescript@5.5.4)(vue@3.4.19)
@@ -832,8 +835,8 @@ packages:
vue-i18n:
optional: true
dependencies:
- '@intlify/message-compiler': 10.0.0
- '@intlify/shared': 10.0.0
+ '@intlify/message-compiler': 11.0.0-rc.1
+ '@intlify/shared': 11.0.0-rc.1
jsonc-eslint-parser: 1.4.1
source-map: 0.6.1
vue-i18n: 9.9.1(vue@3.4.19)
@@ -847,11 +850,11 @@ packages:
'@intlify/message-compiler': 9.9.1
'@intlify/shared': 9.9.1
- /@intlify/message-compiler@10.0.0:
- resolution: {integrity: sha512-OcaWc63NC/9p1cMdgoNKBj4d61BH8sUW1Hfs6YijTd9656ZR4rNqXAlRnBrfS5ABq0vjQjpa8VnyvH9hK49yBw==}
+ /@intlify/message-compiler@11.0.0-rc.1:
+ resolution: {integrity: sha512-TGw2uBfuTFTegZf/BHtUQBEKxl7Q/dVGLoqRIdw8lFsp9g/53sYn5iD+0HxIzdYjbWL6BTJMXCPUHp9PxDTRPw==}
engines: {node: '>= 16'}
dependencies:
- '@intlify/shared': 10.0.0
+ '@intlify/shared': 11.0.0-rc.1
source-map-js: 1.0.2
dev: true
@@ -862,8 +865,8 @@ packages:
'@intlify/shared': 9.9.1
source-map-js: 1.0.2
- /@intlify/shared@10.0.0:
- resolution: {integrity: sha512-6ngLfI7DOTew2dcF9WMJx+NnMWghMBhIiHbGg+wRvngpzD5KZJZiJVuzMsUQE1a5YebEmtpTEfUrDp/NqVGdiw==}
+ /@intlify/shared@11.0.0-rc.1:
+ resolution: {integrity: sha512-8tR1xe7ZEbkabTuE/tNhzpolygUn9OaYp9yuYAF4MgDNZg06C3Qny80bes2/e9/Wm3aVkPUlCw6WgU7mQd0yEg==}
engines: {node: '>= 16'}
dev: true
@@ -887,7 +890,7 @@ packages:
optional: true
dependencies:
'@intlify/bundle-utils': 4.0.0(vue-i18n@9.9.1)
- '@intlify/shared': 10.0.0
+ '@intlify/shared': 11.0.0-rc.1
'@rollup/pluginutils': 4.2.1
'@vue/compiler-sfc': 3.4.19
debug: 4.3.4(supports-color@8.1.1)
@@ -4960,6 +4963,10 @@ packages:
uuid: 8.3.2
dev: true
+ /moment@2.30.1:
+ resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==}
+ dev: false
+
/ms@2.0.0:
resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
diff --git a/src/components/common/VnChangePassword.vue b/src/components/common/VnChangePassword.vue
index 79784f3c5..d8374498f 100644
--- a/src/components/common/VnChangePassword.vue
+++ b/src/components/common/VnChangePassword.vue
@@ -2,9 +2,9 @@
import { ref } from 'vue';
import { useI18n } from 'vue-i18n';
import VnRow from '../ui/VnRow.vue';
-import VnInput from './VnInput.vue';
import FetchData from '../FetchData.vue';
import useNotify from 'src/composables/useNotify';
+import VnInputPassword from 'src/components/common/VnInputPassword.vue';
const props = defineProps({
submitFn: { type: Function, default: () => {} },
@@ -70,19 +70,19 @@ defineExpose({ show: () => changePassDialog.value.show() });
-
-
diff --git a/src/components/common/VnInput.vue b/src/components/common/VnInput.vue
index 3cecf760a..4c7445aab 100644
--- a/src/components/common/VnInput.vue
+++ b/src/components/common/VnInput.vue
@@ -45,6 +45,7 @@ const $props = defineProps({
});
const vnInputRef = ref(null);
+const showPassword = ref(false);
const value = computed({
get() {
return $props.modelValue;
@@ -134,7 +135,7 @@ const handleInsertMode = (e) => {
hide-bottom-space
:data-cy="$attrs.dataCy ?? $attrs.label + '_input'"
>
-
+
@@ -158,7 +159,7 @@ const handleInsertMode = (e) => {
emit('remove');
}
"
- >
+ />
@@ -169,18 +170,3 @@ const handleInsertMode = (e) => {
-
- en:
- inputMin: Must be more than {value}
- maxLength: The value exceeds {value} characters
- inputMax: Must be less than {value}
- es:
- inputMin: Debe ser mayor a {value}
- maxLength: El valor excede los {value} carácteres
- inputMax: Debe ser menor a {value}
-
-
diff --git a/src/components/common/VnInputPassword.vue b/src/components/common/VnInputPassword.vue
new file mode 100644
index 000000000..56981c0c3
--- /dev/null
+++ b/src/components/common/VnInputPassword.vue
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
diff --git a/src/i18n/locale/en.yml b/src/i18n/locale/en.yml
index 278c3514d..bf001c9ba 100644
--- a/src/i18n/locale/en.yml
+++ b/src/i18n/locale/en.yml
@@ -455,12 +455,26 @@ entry:
packingOut: Package out
landing: Landing
isExcludedFromAvailable: Es inventory
+ params:
+ toShipped: To
+ fromShipped: From
+ warehouseiNFk: Warehouse
+ daysOnward: Days onward
+ daysAgo: Days ago
+ warehouseInFk: Warehouse in
ticket:
params:
ticketFk: Ticket ID
weekDay: Weekday
agencyModeFk: Agency
id: Worker
+ state: State
+ created: Created
+ externalId: External ID
+ counter: Counter
+ freightItemName: Freight item name
+ packageItemName: Package item name
+ longName: Long name
card:
customerId: Customer ID
customerCard: Customer card
diff --git a/src/i18n/locale/es.yml b/src/i18n/locale/es.yml
index 139486e03..2c95f936c 100644
--- a/src/i18n/locale/es.yml
+++ b/src/i18n/locale/es.yml
@@ -456,12 +456,25 @@ entry:
packingOut: Embalaje envíos
landing: Llegada
isExcludedFromAvailable: Es inventario
+ params:
+ toShipped: Hasta
+ fromShipped: Desde
+ warehouseInFk: Alm. entrada
+ daysOnward: Días adelante
+ daysAgo: Días atras
ticket:
params:
ticketFk: ID de ticket
weekDay: Salida
agencyModeFk: Agencia
id: Comercial
+ created: Creado
+ state: Estado
+ externalId: ID externo
+ counter: Contador
+ freightItemName: Nombre
+ packageItemName: Embalaje
+ longName: Descripción
card:
customerId: ID cliente
customerCard: Ficha del cliente
diff --git a/src/pages/Account/AccountCreate.vue b/src/pages/Account/AccountCreate.vue
index 6b7c049c8..b925ff06a 100644
--- a/src/pages/Account/AccountCreate.vue
+++ b/src/pages/Account/AccountCreate.vue
@@ -6,6 +6,7 @@ import FormModelPopup from 'components/FormModelPopup.vue';
import VnSelect from 'src/components/common/VnSelect.vue';
import FetchData from 'components/FetchData.vue';
import VnInput from 'src/components/common/VnInput.vue';
+import VnInputPassword from 'src/components/common/VnInputPassword.vue';
const { t } = useI18n();
const router = useRouter();
@@ -61,10 +62,10 @@ const redirectToAccountBasicData = (_, { id }) => {
hide-selected
:rules="validate('VnUser.roleFk')"
/>
-
await getInitialLdapConfig());
:required="true"
:rules="validate('LdapConfig.rdn')"
/>
-
-
diff --git a/src/pages/Account/AccountSamba.vue b/src/pages/Account/AccountSamba.vue
index 699a638eb..7b36de85f 100644
--- a/src/pages/Account/AccountSamba.vue
+++ b/src/pages/Account/AccountSamba.vue
@@ -8,6 +8,7 @@ import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
import { useArrayData } from 'src/composables/useArrayData';
import useNotify from 'src/composables/useNotify.js';
import axios from 'axios';
+import VnInputPassword from 'src/components/common/VnInputPassword.vue';
const { t } = useI18n();
const { notify } = useNotify();
@@ -143,10 +144,9 @@ onMounted(async () => await getInitialSambaConfig());
v-model="data.adUser"
:rules="validate('SambaConfigs.adUser')"
/>
-
{{ t('account.card.actions.sync.tooltip') }}
-
diff --git a/src/pages/Customer/locale/en.yml b/src/pages/Customer/locale/en.yml
index 1d2497ded..1918838b7 100644
--- a/src/pages/Customer/locale/en.yml
+++ b/src/pages/Customer/locale/en.yml
@@ -95,6 +95,7 @@ customer:
isToBeMailed: Mailing
hasSepaVnl: VNL B2B received
params:
+ id: Id
isWorker: Is Worker
payMethod: Payment Method
workerFk: Author
@@ -102,4 +103,15 @@ customer:
created: Last Update Date
creditInsurance: Credit Insurance
defaulterSinced: Defaulted Since
- hasRecovery: Has Recovery
\ No newline at end of file
+ hasRecovery: Has Recovery
+ socialName: Social name
+ city: City
+ phone: Phone
+ postcode: Postcode
+ campaign: Campaign
+ grouped: Grouped
+ search: Contains
+ itemId: Item Id
+ ticketFk: Ticket Id
+ description: Description
+ quantity: Quantity
diff --git a/src/pages/Customer/locale/es.yml b/src/pages/Customer/locale/es.yml
index 1b56f6805..d5db3df1b 100644
--- a/src/pages/Customer/locale/es.yml
+++ b/src/pages/Customer/locale/es.yml
@@ -97,6 +97,7 @@ customer:
isToBeMailed: Env. emails
hasSepaVnl: Recibido B2B VNL
params:
+ id: ID
isWorker: Es trabajador
payMethod: F. Pago
workerFk: Autor
@@ -104,4 +105,15 @@ customer:
created: Fecha Ú. O.
creditInsurance: Crédito A.
defaulterSinced: Desde
- hasRecovery: Tiene recobro
\ No newline at end of file
+ hasRecovery: Tiene recobro
+ socialName: Razón social
+ campaign: Campaña
+ city: Ciudad
+ phone: Teléfono
+ postcode: Código postal
+ grouped: Agrupado
+ search: Contiene
+ itemId: Id Artículo
+ ticketFk: Id Ticket
+ description: Descripción
+ quantity: Cantidad
diff --git a/src/pages/Entry/EntryBuysTableDialog.vue b/src/pages/Entry/EntryBuysTableDialog.vue
index 3975bff19..a2d8c9117 100644
--- a/src/pages/Entry/EntryBuysTableDialog.vue
+++ b/src/pages/Entry/EntryBuysTableDialog.vue
@@ -1,24 +1,24 @@
+function downloadCSV(rows) {
+ const headers = ['id', 'itemFk', 'name', 'stickers', 'packing', 'comment'];
+
+ const csvRows = rows.map((row) => {
+ const buy = row;
+ const item = buy.item || {};
+
+ return [
+ buy.id,
+ buy.itemFk,
+ item.name || '',
+ buy.stickers,
+ buy.packing,
+ item.comment || '',
+ ].join(',');
+ });
+
+ const csvContent = [headers.join(','), ...csvRows].join('\n');
+
+ const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });
+ const url = URL.createObjectURL(blob);
+ const link = document.createElement('a');
+ link.href = url;
+ link.setAttribute('download', `${entityId.value}data.csv`);
+ document.body.appendChild(link);
+ link.click();
+ document.body.removeChild(link);
+}
+
-
-
- {{ title }}
-
-
-
-
-
-
[
>
[
:grid="$q.screen.lt.md"
:no-data-label="t('globals.noResults')"
>
+
+
+
+
+
+
@@ -118,7 +144,6 @@ const entriesTableColumns = computed(() => [
[
actions: [
{
title: t('myEntries.printLabels'),
- icon: 'print',
+ icon: 'move_item',
isPrimary: true,
action: (row) => printBuys(row.id),
},
diff --git a/src/pages/Entry/locale/en.yml b/src/pages/Entry/locale/en.yml
index 68cc9caa7..6e41566d0 100644
--- a/src/pages/Entry/locale/en.yml
+++ b/src/pages/Entry/locale/en.yml
@@ -17,13 +17,6 @@ myEntries:
warehouseInFk: Warehouse in
daysOnward: Days onward
daysAgo: Days ago
+ downloadCsv: Download CSV
wasteRecalc:
recalcOk: The wastes were successfully recalculated
-entry:
- params:
- toShipped: To
- fromShipped: From
- warehouseiNFk: Warehouse
- daysOnward: Days onward
- daysAgo: Days ago
-
\ No newline at end of file
diff --git a/src/pages/Entry/locale/es.yml b/src/pages/Entry/locale/es.yml
index cc9a4ff7b..7e627b09f 100644
--- a/src/pages/Entry/locale/es.yml
+++ b/src/pages/Entry/locale/es.yml
@@ -20,13 +20,6 @@ myEntries:
warehouseInFk: Alm. entrada
daysOnward: Días adelante
daysAgo: Días atras
+ downloadCsv: Descargar CSV
wasteRecalc:
recalcOk: Se han recalculado las mermas correctamente
-entry:
- params:
- toShipped: Hasta
- fromShipped: Desde
- warehouseInFk: Alm. entrada
- daysOnward: Días adelante
- daysAgo: Días atras
-
\ No newline at end of file
diff --git a/src/pages/Login/LoginMain.vue b/src/pages/Login/LoginMain.vue
index 44b868ebd..a4c3566a9 100644
--- a/src/pages/Login/LoginMain.vue
+++ b/src/pages/Login/LoginMain.vue
@@ -3,7 +3,7 @@ import { ref } from 'vue';
import { Notify } from 'quasar';
import { useI18n } from 'vue-i18n';
import { useRouter } from 'vue-router';
-
+import VnInputPassword from 'src/components/common/VnInputPassword.vue';
import { useSession } from 'src/composables/useSession';
import { useLogin } from 'src/composables/useLogin';
@@ -63,11 +63,10 @@ async function onSubmit() {
:rules="[(val) => (val && val.length > 0) || t('login.fieldRequired')]"
color="primary"
/>
-
diff --git a/src/pages/Login/ResetPassword.vue b/src/pages/Login/ResetPassword.vue
index 2751f1ceb..081801e0e 100644
--- a/src/pages/Login/ResetPassword.vue
+++ b/src/pages/Login/ResetPassword.vue
@@ -7,6 +7,7 @@ import axios from 'axios';
import VnInput from 'components/common/VnInput.vue';
import VnOutForm from 'components/ui/VnOutForm.vue';
+import VnInputPassword from 'src/components/common/VnInputPassword.vue';
const quasar = useQuasar();
const router = useRouter();
@@ -54,8 +55,7 @@ async function onSubmit() {
-
-
-
+
-
+
moment(selectedDate.value).isoWeekYear());
const worker = computed(() => arrayData.store?.data);
const canSend = computed(() =>
acl.hasAny([{ model: 'WorkerTimeControl', props: 'sendMail', accessType: 'WRITE' }])
@@ -278,7 +280,7 @@ const fetchHours = async () => {
const fetchWeekData = async () => {
const where = {
- year: selectedDate.value.getFullYear(),
+ year: selectedDateYear.value,
week: selectedWeekNumber.value,
};
const mail = (
@@ -343,7 +345,7 @@ const getMailStates = async (date) => {
const prevMonth = month == 1 ? 12 : month - 1;
const params = {
month,
- year: date.getFullYear(),
+ year: selectedDateYear.value,
};
const curMonthStates = (await axios.get(url, { params })).data;
@@ -370,7 +372,7 @@ const showReasonForm = () => {
const updateWorkerTimeControlMail = async (state, reason) => {
const params = {
- year: selectedDate.value.getFullYear(),
+ year: selectedDateYear.value,
week: selectedWeekNumber.value,
state,
};
@@ -400,7 +402,7 @@ const resendEmail = async () => {
const params = {
recipient: worker.value[0]?.user?.emailUser?.email,
week: selectedWeekNumber.value,
- year: selectedDate.value.getFullYear(),
+ year: selectedDateYear.value,
workerId: Number(route.params.id),
state: 'SENDED',
};
diff --git a/test/cypress/integration/outLogin/login.spec.js b/test/cypress/integration/outLogin/login.spec.js
index 3db223cdb..2bd5a8c3b 100755
--- a/test/cypress/integration/outLogin/login.spec.js
+++ b/test/cypress/integration/outLogin/login.spec.js
@@ -19,6 +19,7 @@ describe('Login', () => {
it('should fail to log in using wrong password', () => {
cy.get('input[aria-label="Username"]').type('employee');
cy.get('input[aria-label="Password"]').type('wrongPassword');
+ cy.get('.q-field__append > .q-icon');
cy.get('button[type="submit"]').click();
cy.get('.q-notification__message').should(
'have.text',