+
diff --git a/src/components/ui/VnSearchbar.vue b/src/components/ui/VnSearchbar.vue
index a78403b5c..dc6d4751c 100644
--- a/src/components/ui/VnSearchbar.vue
+++ b/src/components/ui/VnSearchbar.vue
@@ -108,6 +108,7 @@ async function search() {
...Object.fromEntries(staticParams),
search: searchText.value,
},
+ ...{ filter: props.filter },
};
if (props.whereFilter) {
diff --git a/src/components/ui/VnToSummary.vue b/src/components/ui/VnToSummary.vue
new file mode 100644
index 000000000..1c7d6cf01
--- /dev/null
+++ b/src/components/ui/VnToSummary.vue
@@ -0,0 +1,33 @@
+
+
+
+
+
diff --git a/src/components/ui/VnUserLink.vue b/src/components/ui/VnUserLink.vue
index b04ea7476..00c50ee34 100644
--- a/src/components/ui/VnUserLink.vue
+++ b/src/components/ui/VnUserLink.vue
@@ -1,20 +1,18 @@
-
- {{ $props.defaultName ? $props.name ?? t('globals.system') : $props.name }}
+
+ {{ defaultName ? name ?? $t('globals.system') : name }}
-
+
diff --git a/src/components/ui/VnUsesMana.vue b/src/components/ui/VnUsesMana.vue
new file mode 100644
index 000000000..891de5f63
--- /dev/null
+++ b/src/components/ui/VnUsesMana.vue
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
diff --git a/src/composables/getTotal.js b/src/composables/getTotal.js
new file mode 100644
index 000000000..41c4330c4
--- /dev/null
+++ b/src/composables/getTotal.js
@@ -0,0 +1,10 @@
+import { toCurrency } from 'src/filters';
+
+export function getTotal(rows, key, opts = {}) {
+ const { currency, cb } = opts;
+ const total = rows.reduce((acc, row) => acc + +(cb ? cb(row) : row[key] || 0), 0);
+
+ return currency
+ ? toCurrency(total, currency == 'default' ? undefined : currency)
+ : total;
+}
diff --git a/src/composables/useAcl.js b/src/composables/useAcl.js
index 46aaa3c25..ede359186 100644
--- a/src/composables/useAcl.js
+++ b/src/composables/useAcl.js
@@ -16,13 +16,18 @@ export function useAcl() {
state.setAcls(acls);
}
- function hasAny(model, prop, accessType) {
- const acls = state.getAcls().value[model];
- if (acls)
- return ['*', prop].some((key) => {
- const acl = acls[key];
- return acl && (acl['*'] || acl[accessType]);
- });
+ function hasAny(acls) {
+ for (const acl of acls) {
+ let { model, props, accessType } = acl;
+ const modelAcls = state.getAcls().value[model];
+ Array.isArray(props) || (props = [props]);
+ if (modelAcls)
+ return ['*', ...props].some((key) => {
+ const acl = modelAcls[key];
+ return acl && (acl['*'] || acl[accessType]);
+ });
+ }
+ return false;
}
return {
diff --git a/src/composables/useArrayData.js b/src/composables/useArrayData.js
index 651bcefb0..30bcac66b 100644
--- a/src/composables/useArrayData.js
+++ b/src/composables/useArrayData.js
@@ -26,7 +26,8 @@ export function useArrayData(key = useRoute().meta.moduleName, userOptions) {
const params = JSON.parse(query[searchUrl]);
const filter = params?.filter && JSON.parse(params?.filter ?? '{}');
delete params.filter;
- store.userParams = { ...params, ...store.userParams };
+
+ store.userParams = { ...store.userParams, ...params };
store.userFilter = { ...filter, ...store.userFilter };
if (filter?.order) store.order = filter.order;
}
@@ -113,7 +114,7 @@ export function useArrayData(key = useRoute().meta.moduleName, userOptions) {
for (const row of response.data) store.data.push(row);
} else {
store.data = response.data;
- if (!document.querySelectorAll('[role="dialog"]').length)
+ if (!document.querySelectorAll('[role="dialog"][aria-modal="true"]').length)
updateRouter && updateStateParams();
}
diff --git a/src/composables/usePrintService.js b/src/composables/usePrintService.js
index edf9598b2..c6c212ad8 100644
--- a/src/composables/usePrintService.js
+++ b/src/composables/usePrintService.js
@@ -1,22 +1,26 @@
import { useSession } from './useSession';
import axios from 'axios';
import { useQuasar } from 'quasar';
+import { useI18n } from 'vue-i18n';
export function usePrintService() {
const quasar = useQuasar();
+ const { t } = useI18n();
+
const { getTokenMultimedia } = useSession();
function sendEmail(path, params) {
return axios.post(path, params).then(() =>
quasar.notify({
- message: 'Notification sent',
+ message: t('globals.notificationSent'),
type: 'positive',
icon: 'check',
})
);
}
- function openReport(path, params) {
+ function openReport(path, params, isNewTab = '_self') {
+ if (typeof params === 'string') params = JSON.parse(params);
params = Object.assign(
{
access_token: getTokenMultimedia(),
@@ -25,8 +29,7 @@ export function usePrintService() {
);
const query = new URLSearchParams(params).toString();
-
- window.open(`api/${path}?${query}`);
+ window.open(`api/${path}?${query}`, isNewTab);
}
return {
diff --git a/src/css/app.scss b/src/css/app.scss
index 357c9ecdb..d4c76ad6b 100644
--- a/src/css/app.scss
+++ b/src/css/app.scss
@@ -37,6 +37,10 @@ a {
.link {
color: $color-link;
cursor: pointer;
+
+ &--white {
+ color: white;
+ }
}
.tx-color-link {
@@ -264,6 +268,7 @@ input::-webkit-inner-spin-button {
max-width: 400px;
}
}
+
.edit-photo-btn {
position: absolute;
right: 12px;
@@ -271,3 +276,19 @@ input::-webkit-inner-spin-button {
z-index: 1;
cursor: pointer;
}
+
+.subName {
+ color: var(--vn-label-color);
+ text-transform: uppercase;
+}
+
+.q-date {
+ &__today {
+ border: 2px solid $info;
+ color: $info;
+ }
+}
+
+.no-visible {
+ visibility: hidden;
+}
diff --git a/src/css/quasar.variables.scss b/src/css/quasar.variables.scss
index aeac483be..9f7c62848 100644
--- a/src/css/quasar.variables.scss
+++ b/src/css/quasar.variables.scss
@@ -36,7 +36,6 @@ $color-font-secondary: #777;
.bg-success {
background-color: $positive;
}
-
.bg-notice {
background-color: $info;
}
diff --git a/src/filters/toHour.js b/src/filters/toHour.js
index 40821e237..52df9c8cd 100644
--- a/src/filters/toHour.js
+++ b/src/filters/toHour.js
@@ -4,7 +4,7 @@ export default function toHour(date) {
if (!isValidDate(date)) {
return '--:--';
}
- return (new Date(date || '')).toLocaleTimeString([], {
+ return new Date(date || '').toLocaleTimeString([], {
hour: '2-digit',
minute: '2-digit',
});
diff --git a/src/i18n/locale/en.yml b/src/i18n/locale/en.yml
index ef5e02b12..fa0a14f45 100644
--- a/src/i18n/locale/en.yml
+++ b/src/i18n/locale/en.yml
@@ -2,6 +2,7 @@ globals:
lang:
es: Spanish
en: English
+ quantity: Quantity
language: Language
entity: Entity
user: User
@@ -40,6 +41,8 @@ globals:
noChanges: No changes to save
changesToSave: You have changes pending to save
confirmRemove: You are about to delete this row. Are you sure?
+ rowWillBeRemoved: This row will be removed
+ sureToContinue: Are you sure you want to continue?
rowAdded: Row added
rowRemoved: Row removed
pleaseWait: Please wait...
@@ -47,6 +50,7 @@ globals:
summary:
basicData: Basic data
daysOnward: Days onward
+ daysAgo: Days ago
today: Today
yesterday: Yesterday
dateFormat: en-GB
@@ -84,7 +88,7 @@ globals:
description: Description
id: Id
order: Order
- original: Original
+ original: Phys. Doc
file: File
selectFile: Select a file
copyClipboard: Copy on clipboard
@@ -96,13 +100,20 @@ globals:
to: To
notes: Notes
refresh: Refresh
+ item: Item
+ ticket: Ticket
+ campaign: Campaign
+ weight: Weight
+ error: Ups! Something went wrong
+ recalc: Recalculate
pageTitles:
logIn: Login
+ addressEdit: Update address
summary: Summary
basicData: Basic data
log: Logs
parkingList: Parkings list
- agencyList: Agencies list
+ agencyList: Agencies
agency: Agency
workCenters: Work centers
modes: Modes
@@ -122,9 +133,11 @@ globals:
notifications: Notifications
defaulter: Defaulter
customerCreate: New customer
+ createOrder: New order
fiscalData: Fiscal data
billingData: Billing data
consignees: Consignees
+ address-create: New address
notes: Notes
credits: Credits
greuges: Greuges
@@ -148,6 +161,7 @@ globals:
dms: File management
entryCreate: New entry
latestBuys: Latest buys
+ reserves: Reserves
tickets: Tickets
ticketCreate: New Tickets
boxing: Boxing
@@ -195,7 +209,7 @@ globals:
roadmap: Roadmap
stops: Stops
routes: Routes
- cmrsList: CMRs list
+ cmrsList: CMRs
RouteList: List
routeCreate: New route
RouteRoadmap: Roadmaps
@@ -260,6 +274,11 @@ globals:
ticketsMonitor: Tickets monitor
clientsActionsMonitor: Clients and actions
serial: Serial
+ medical: Mutual
+ RouteExtendedList: Router
+ wasteRecalc: Waste recaclulate
+ operator: Operator
+ supplier: Supplier
created: Created
worker: Worker
now: Now
@@ -274,12 +293,30 @@ globals:
createInvoiceIn: Create invoice in
myAccount: My account
noOne: No one
+ maxTemperature: Max
+ minTemperature: Min
+ params:
+ id: ID
+ clientFk: Client id
+ salesPersonFk: Sales person
+ warehouseFk: Warehouse
+ provinceFk: Province
+ from: From
+ To: To
+ stateFk: State
+ departmentFk: Department
+ email: Email
+ SSN: SSN
+ fi: FI
+ changePass: Change password
+ deleteConfirmTitle: Delete selected elements
errors:
statusUnauthorized: Access denied
statusInternalServerError: An internal server error has ocurred
statusBadGateway: It seems that the server has fall down
statusGatewayTimeout: Could not contact the server
userConfig: Error fetching user config
+ updateUserConfig: Error updating user config
tokenConfig: Error fetching token config
writeRequest: The requested operation could not be completed
login:
@@ -310,135 +347,6 @@ resetPassword:
repeatPassword: Repeat password
passwordNotMatch: Passwords don't match
passwordChanged: Password changed
-customer:
- list:
- phone: Phone
- email: Email
- customerOrders: Display customer orders
- moreOptions: More options
- card:
- customerList: Customer list
- customerId: Claim ID
- salesPerson: Sales person
- credit: Credit
- risk: Risk
- securedCredit: Secured credit
- payMethod: Pay method
- debt: Debt
- isFrozen: Customer frozen
- hasDebt: Customer has debt
- isDisabled: Customer inactive
- notChecked: Customer no checked
- webAccountInactive: Web account inactive
- noWebAccess: Web access is disabled
- businessType: Business type
- passwordRequirements: 'The password must have at least { length } length characters, {nAlpha} alphabetic characters, {nUpper} capital letters, {nDigits} digits and {nPunct} symbols (Ex: $%&.)\n'
- businessTypeFk: Business type
- summary:
- basicData: Basic data
- fiscalAddress: Fiscal address
- fiscalData: Fiscal data
- billingData: Billing data
- consignee: Default consignee
- businessData: Business data
- financialData: Financial data
- customerId: Customer ID
- name: Name
- contact: Contact
- phone: Phone
- mobile: Mobile
- email: Email
- salesPerson: Sales person
- contactChannel: Contact channel
- socialName: Social name
- fiscalId: Fiscal ID
- postcode: Postcode
- province: Province
- country: Country
- street: Address
- isEqualizated: Is equalizated
- isActive: Is active
- invoiceByAddress: Invoice by address
- verifiedData: Verified data
- hasToInvoice: Has to invoice
- notifyByEmail: Notify by email
- vies: VIES
- payMethod: Pay method
- bankAccount: Bank account
- dueDay: Due day
- hasLcr: Has LCR
- hasCoreVnl: Has core VNL
- hasB2BVnl: Has B2B VNL
- addressName: Address name
- addressCity: City
- addressStreet: Street
- username: Username
- webAccess: Web access
- totalGreuge: Total greuge
- mana: Mana
- priceIncreasingRate: Price increasing rate
- averageInvoiced: Average invoiced
- claimRate: Claming rate
- risk: Risk
- riskInfo: Invoices minus payments plus orders not yet invoiced
- credit: Credit
- creditInfo: Company's maximum risk
- securedCredit: Secured credit
- securedCreditInfo: Solunion's maximum risk
- balance: Balance
- balanceInfo: Invoices minus payments
- balanceDue: Balance due
- balanceDueInfo: Deviated invoices minus payments
- recoverySince: Recovery since
- businessType: Business Type
- city: City
- descriptorInfo: Invoices minus payments plus orders not yet
- rating: Rating
- recommendCredit: Recommended credit
- basicData:
- socialName: Fiscal name
- businessType: Business type
- contact: Contact
- youCanSaveMultipleEmails: You can save multiple emails
- email: Email
- phone: Phone
- mobile: Mobile
- salesPerson: Sales person
- contactChannel: Contact channel
- previousClient: Previous client
- extendedList:
- tableVisibleColumns:
- id: Identifier
- name: Name
- socialName: Social name
- fi: Tax number
- salesPersonFk: Salesperson
- credit: Credit
- creditInsurance: Credit insurance
- phone: Phone
- mobile: Mobile
- street: Street
- countryFk: Country
- provinceFk: Province
- city: City
- postcode: Postcode
- email: Email
- created: Created
- businessTypeFk: Business type
- payMethodFk: Billing data
- sageTaxTypeFk: Sage tax type
- sageTransactionTypeFk: Sage tr. type
- isActive: Active
- isVies: Vies
- isTaxDataChecked: Verified data
- isEqualizated: Is equalizated
- isFreezed: Freezed
- hasToInvoice: Invoice
- hasToInvoiceByAddress: Invoice by address
- isToBeMailed: Mailing
- hasLcr: Received LCR
- hasCoreVnl: VNL core received
- hasSepaVnl: VNL B2B received
entry:
list:
newEntry: New entry
@@ -602,6 +510,8 @@ ticket:
warehouse: Warehouse
customerCard: Customer card
alias: Alias
+ ticketList: Ticket List
+ newOrder: New Order
boxing:
expedition: Expedition
item: Item
@@ -623,6 +533,7 @@ ticket:
landed: Landed
consigneePhone: Consignee phone
consigneeMobile: Consignee mobile
+ consigneeAddress: Consignee address
clientPhone: Client phone
clientMobile: Client mobile
consignee: Consignee
@@ -652,6 +563,11 @@ ticket:
weight: Weight
goTo: Go to
summaryAmount: Summary
+ purchaseRequest: Purchase request
+ service: Service
+ description: Description
+ attender: Attender
+ ok: Ok
create:
client: Client
address: Address
@@ -675,7 +591,6 @@ invoiceOut:
client: Client
company: Company
customerCard: Customer card
- ticketList: Ticket List
summary:
issued: Issued
created: Created
@@ -752,56 +667,6 @@ parking:
searchBar:
info: You can search by parking code
label: Search parking...
-invoiceIn:
- list:
- ref: Reference
- supplier: Supplier
- supplierRef: Supplier ref.
- serialNumber: Serial number
- serial: Serial
- file: File
- issued: Issued
- isBooked: Is booked
- awb: AWB
- amount: Amount
- card:
- issued: Issued
- amount: Amount
- client: Client
- company: Company
- customerCard: Customer card
- ticketList: Ticket List
- vat: Vat
- dueDay: Due day
- intrastat: Intrastat
- summary:
- supplier: Supplier
- supplierRef: Supplier ref.
- currency: Currency
- docNumber: Doc number
- issued: Expedition date
- operated: Operation date
- bookEntried: Entry date
- bookedDate: Booked date
- sage: Sage withholding
- vat: Undeductible VAT
- company: Company
- booked: Booked
- expense: Expense
- taxableBase: Taxable base
- rate: Rate
- sageVat: Sage vat
- sageTransaction: Sage transaction
- dueDay: Date
- bank: Bank
- amount: Amount
- foreignValue: Foreign value
- dueTotal: Due day
- noMatch: Do not match
- code: Code
- net: Net
- stems: Stems
- country: Country
order:
field:
salesPersonFk: Sales Person
@@ -878,6 +743,8 @@ worker:
timeControl: Time control
locker: Locker
balance: Balance
+ medical: Medical
+ operator: Operator
list:
name: Name
email: Email
@@ -889,6 +756,7 @@ worker:
newWorker: New worker
card:
workerId: Worker ID
+ user: User
name: Name
email: Email
phone: Phone
@@ -949,14 +817,23 @@ worker:
bankEntity: Swift / BIC
formation:
tableVisibleColumns:
- course: Curso
- startDate: Fecha Inicio
- endDate: Fecha Fin
- center: Centro Formación
- invoice: Factura
- amount: Importe
- remark: Bonficado
- hasDiploma: Diploma
+ course: Course
+ startDate: Start date
+ endDate: End date
+ center: Training center
+ invoice: Invoice
+ amount: Amount
+ remark: Remark
+ hasDiploma: Has diploma
+ medical:
+ tableVisibleColumns:
+ date: Date
+ time: Hour
+ center: Formation Center
+ invoice: Invoice
+ amount: Amount
+ isFit: Fit
+ remark: Observations
imageNotFound: Image not found
balance:
tableVisibleColumns:
@@ -965,7 +842,29 @@ worker:
debit: Debt
credit: Have
concept: Concept
+ operator:
+ numberOfWagons: Number of wagons
+ train: Train
+ itemPackingType: Item packing type
+ warehouse: Warehouse
+ sector: Sector
+ labeler: Printer
+ linesLimit: Lines limit
+ volumeLimit: Volume limit
+ sizeLimit: Size limit
+ isOnReservationMode: Reservation mode
+ machine: Machine
wagon:
+ pageTitles:
+ wagons: Wagons
+ wagonsList: Wagons List
+ wagonCreate: Create wagon
+ wagonEdit: Edit wagon
+ typesList: Types List
+ typeCreate: Create type
+ typeEdit: Edit type
+ wagonCounter: Trolley counter
+ wagonTray: Tray List
type:
name: Name
submit: Submit
@@ -994,34 +893,7 @@ wagon:
minHeightBetweenTrays: 'The minimum height between trays is '
maxWagonHeight: 'The maximum height of the wagon is '
uncompleteTrays: There are incomplete trays
-route:
- pageTitles:
- agency: Agency List
- routes: Routes
- cmrsList: CMRs list
- RouteList: List
- routeCreate: New route
- basicData: Basic Data
- summary: Summary
- RouteRoadmap: Roadmaps
- RouteRoadmapCreate: Create roadmap
- tickets: Tickets
- log: Log
- autonomous: Autonomous
- cmr:
- list:
- results: results
- cmrFk: CMR id
- hasCmrDms: Attached in gestdoc
- 'true': 'Yes'
- 'false': 'No'
- ticketFk: Ticketd id
- routeFk: Route id
- country: Country
- clientFk: Client id
- shipped: Preparation date
- viewCmr: View CMR
- downloadCmrs: Download CMRs
+
supplier:
list:
payMethod: Pay method
@@ -1037,6 +909,7 @@ supplier:
account: Account
payMethod: Pay Method
payDay: Pay Day
+ country: Country
summary:
responsible: Responsible
notes: Notes
@@ -1135,6 +1008,7 @@ travel:
warehouseOut: Warehouse out
totalEntries: Total entries
totalEntriesTooltip: Total entries
+ daysOnward: Landed days onwards
summary:
confirmed: Confirmed
entryId: Entry Id
@@ -1210,7 +1084,7 @@ item:
producer: Producer
landed: Landed
fixedPrice:
- itemId: Item ID
+ itemFk: Item ID
groupingPrice: Grouping price
packingPrice: Packing price
hasMinPrice: Has min price
@@ -1287,6 +1161,7 @@ components:
active: Is active
visible: Is visible
floramondo: Is floramondo
+ showBadDates: Show future items
userPanel:
copyToken: Token copied to clipboard
settings: Settings
diff --git a/src/i18n/locale/es.yml b/src/i18n/locale/es.yml
index 7143bf96f..5dfe90e98 100644
--- a/src/i18n/locale/es.yml
+++ b/src/i18n/locale/es.yml
@@ -3,6 +3,7 @@ globals:
es: Español
en: Inglés
language: Idioma
+ quantity: Cantidad
entity: Entidad
user: Usuario
details: Detalles
@@ -39,6 +40,8 @@ globals:
noChanges: Sin cambios que guardar
changesToSave: Tienes cambios pendientes de guardar
confirmRemove: Vas a eliminar este registro. ¿Continuar?
+ rowWillBeRemoved: Esta linea se eliminará
+ sureToContinue: ¿Seguro que quieres continuar?
rowAdded: Fila añadida
rowRemoved: Fila eliminada
pleaseWait: Por favor espera...
@@ -46,6 +49,7 @@ globals:
summary:
basicData: Datos básicos
daysOnward: Días adelante
+ daysAgo: Días atras
today: Hoy
yesterday: Ayer
dateFormat: es-ES
@@ -60,7 +64,7 @@ globals:
shipped: F. envío
totalEntries: Ent. totales
amount: Importe
- packages: Bultos
+ packages: Embalajes
download: Descargar
downloadPdf: Descargar PDF
selectRows: 'Seleccionar las { numberRows } filas(s)'
@@ -86,7 +90,7 @@ globals:
description: Descripción
id: Id
order: Orden
- original: Original
+ original: Doc. física
file: Fichero
selectFile: Seleccione un fichero
copyClipboard: Copiar en portapapeles
@@ -98,13 +102,20 @@ globals:
to: Hasta
notes: Notas
refresh: Actualizar
+ item: Artículo
+ ticket: Ticket
+ campaign: Campaña
+ weight: Peso
+ error: ¡Ups! Algo salió mal
+ recalc: Recalcular
pageTitles:
logIn: Inicio de sesión
+ addressEdit: Modificar consignatario
summary: Resumen
basicData: Datos básicos
log: Historial
parkingList: Listado de parkings
- agencyList: Listado de agencias
+ agencyList: Agencias
agency: Agencia
workCenters: Centros de trabajo
modes: Modos
@@ -119,6 +130,7 @@ globals:
inheritedRoles: Roles heredados
customers: Clientes
customerCreate: Nuevo cliente
+ createOrder: Nuevo pedido
list: Listado
webPayments: Pagos Web
extendedList: Listado extendido
@@ -128,6 +140,7 @@ globals:
fiscalData: Datos fiscales
billingData: Forma de pago
consignees: Consignatarios
+ 'address-create': Nuevo consignatario
notes: Notas
credits: Créditos
greuges: Greuges
@@ -151,6 +164,7 @@ globals:
dms: Gestión documental
entryCreate: Nueva entrada
latestBuys: Últimas compras
+ reserves: Reservas
tickets: Tickets
ticketCreate: Nuevo ticket
boxing: Encajado
@@ -199,12 +213,13 @@ globals:
roadmap: Troncales
stops: Paradas
routes: Rutas
- cmrsList: Listado de CMRs
+ cmrsList: CMRs
RouteList: Listado
routeCreate: Nueva ruta
RouteRoadmap: Troncales
RouteRoadmapCreate: Crear troncal
autonomous: Autónomos
+ RouteExtendedList: Enrutador
suppliers: Proveedores
supplier: Proveedor
supplierCreate: Nuevo proveedor
@@ -255,7 +270,7 @@ globals:
tracking: Estados
components: Componentes
pictures: Fotos
- packages: Bultos
+ packages: Embalajes
ldap: LDAP
samba: Samba
twoFactor: Doble factor
@@ -264,6 +279,10 @@ globals:
ticketsMonitor: Monitor de tickets
clientsActionsMonitor: Clientes y acciones
serial: Facturas por serie
+ medical: Mutua
+ wasteRecalc: Recalcular mermas
+ operator: Operario
+ supplier: Proveedor
created: Fecha creación
worker: Trabajador
now: Ahora
@@ -278,12 +297,30 @@ globals:
createInvoiceIn: Crear factura recibida
myAccount: Mi cuenta
noOne: Nadie
+ maxTemperature: Máx
+ minTemperature: Mín
+ params:
+ id: Id
+ clientFk: Id cliente
+ salesPersonFk: Comercial
+ warehouseFk: Almacén
+ provinceFk: Provincia
+ from: Desde
+ To: Hasta
+ stateFk: Estado
+ departmentFk: Departamento
+ email: Correo
+ SSN: NSS
+ fi: NIF
+ changePass: Cambiar contraseña
+ deleteConfirmTitle: Eliminar los elementos seleccionados
errors:
statusUnauthorized: Acceso denegado
statusInternalServerError: Ha ocurrido un error interno del servidor
statusBadGateway: Parece ser que el servidor ha caído
statusGatewayTimeout: No se ha podido contactar con el servidor
userConfig: Error al obtener configuración de usuario
+ updateUserConfig: Error al actualizar la configuración de usuario
tokenConfig: Error al obtener configuración de token
writeRequest: No se pudo completar la operación solicitada
login:
@@ -312,134 +349,6 @@ resetPassword:
repeatPassword: Repetir contraseña
passwordNotMatch: Las contraseñas no coinciden
passwordChanged: Contraseña cambiada
-customer:
- list:
- phone: Teléfono
- email: Email
- customerOrders: Mostrar órdenes del cliente
- moreOptions: Más opciones
- card:
- customerId: ID cliente
- salesPerson: Comercial
- credit: Crédito
- risk: Riesgo
- securedCredit: Crédito asegurado
- payMethod: Método de pago
- debt: Riesgo
- isFrozen: Cliente congelado
- hasDebt: Cliente con riesgo
- isDisabled: Cliente inactivo
- notChecked: Cliente no comprobado
- webAccountInactive: Sin acceso web
- noWebAccess: El acceso web está desactivado
- businessType: Tipo de negocio
- passwordRequirements: 'La contraseña debe tener al menos { length } caracteres de longitud, {nAlpha} caracteres alfabéticos, {nUpper} letras mayúsculas, {nDigits} dígitos y {nPunct} símbolos (Ej: $%&.)'
- businessTypeFk: Tipo de negocio
- summary:
- basicData: Datos básicos
- fiscalAddress: Dirección fiscal
- fiscalData: Datos fiscales
- billingData: Datos de facturación
- consignee: Consignatario pred.
- businessData: Datos comerciales
- financialData: Datos financieros
- customerId: ID cliente
- name: Nombre
- contact: Contacto
- phone: Teléfono
- mobile: Móvil
- email: Email
- salesPerson: Comercial
- contactChannel: Canal de contacto
- socialName: Razón social
- fiscalId: NIF/CIF
- postcode: Código postal
- province: Provincia
- country: País
- street: Calle
- isEqualizated: Recargo de equivalencia
- isActive: Activo
- invoiceByAddress: Facturar por consignatario
- verifiedData: Datos verificados
- hasToInvoice: Facturar
- notifyByEmail: Notificar por email
- vies: VIES
- payMethod: Método de pago
- bankAccount: Cuenta bancaria
- dueDay: Día de pago
- hasLcr: Recibido LCR
- hasCoreVnl: Recibido core VNL
- hasB2BVnl: Recibido B2B VNL
- addressName: Nombre de la dirección
- addressCity: Ciudad
- addressStreet: Calle
- username: Usuario
- webAccess: Acceso web
- totalGreuge: Greuge total
- mana: Maná
- priceIncreasingRate: Ratio de incremento de precio
- averageInvoiced: Facturación media
- claimRate: Ratio de reclamaciones
- risk: Riesgo
- riskInfo: Facturas menos recibos mas pedidos sin facturar
- credit: Crédito
- creditInfo: Riesgo máximo asumido por la empresa
- securedCredit: Crédito asegurado
- securedCreditInfo: Riesgo máximo asumido por Solunion
- balance: Balance
- balanceInfo: Facturas menos recibos
- balanceDue: Saldo vencido
- balanceDueInfo: Facturas fuera de plazo menos recibos
- recoverySince: Recobro desde
- businessType: Tipo de negocio
- city: Población
- descriptorInfo: Facturas menos recibos mas pedidos sin facturar
- rating: Clasificación
- recommendCredit: Crédito recomendado
- basicData:
- socialName: Nombre fiscal
- businessType: Tipo de negocio
- contact: Contacto
- youCanSaveMultipleEmails: Puede guardar varios correos electrónicos encadenándolos mediante comas sin espacios{','} ejemplo{':'} user{'@'}dominio{'.'}com, user2{'@'}dominio{'.'}com siendo el primer correo electrónico el principal
- email: Email
- phone: Teléfono
- mobile: Móvil
- salesPerson: Comercial
- contactChannel: Canal de contacto
- previousClient: Cliente anterior
- extendedList:
- tableVisibleColumns:
- id: Identificador
- name: Nombre
- socialName: Razón social
- fi: NIF / CIF
- salesPersonFk: Comercial
- credit: Crédito
- creditInsurance: Crédito asegurado
- phone: Teléfono
- mobile: Móvil
- street: Dirección fiscal
- countryFk: País
- provinceFk: Provincia
- city: Población
- postcode: Código postal
- email: Email
- created: Fecha creación
- businessTypeFk: Tipo de negocio
- payMethodFk: Forma de pago
- sageTaxTypeFk: Tipo de impuesto Sage
- sageTransactionTypeFk: Tipo tr. sage
- isActive: Activo
- isVies: Vies
- isTaxDataChecked: Datos comprobados
- isEqualizated: Recargo de equivalencias
- isFreezed: Congelado
- hasToInvoice: Factura
- hasToInvoiceByAddress: Factura por consigna
- isToBeMailed: Env. emails
- hasLcr: Recibido LCR
- hasCoreVnl: Recibido core VNL
- hasSepaVnl: Recibido B2B VNL
entry:
list:
newEntry: Nueva entrada
@@ -592,7 +501,7 @@ ticket:
tracking: Estados
components: Componentes
pictures: Fotos
- packages: Bultos
+ packages: Embalajes
list:
nickname: Alias
state: Estado
@@ -610,6 +519,8 @@ ticket:
warehouse: Almacén
customerCard: Ficha del cliente
alias: Alias
+ ticketList: Listado de tickets
+ newOrder: Nuevo pedido
boxing:
expedition: Expedición
item: Artículo
@@ -631,6 +542,7 @@ ticket:
landed: Entregado
consigneePhone: Tel. consignatario
consigneeMobile: Móv. consignatario
+ consigneeAddress: Dir. consignatario
clientPhone: Tel. cliente
clientMobile: Móv. cliente
consignee: Consignatario
@@ -660,6 +572,10 @@ ticket:
weight: Peso
goTo: Ir a
summaryAmount: Resumen
+ purchaseRequest: Petición de compra
+ service: Servicio
+ description: Descripción
+ attender: Consignatario
create:
client: Cliente
address: Dirección
@@ -798,54 +714,6 @@ parking:
searchBar:
info: Puedes buscar por código de parking
label: Buscar parking...
-invoiceIn:
- list:
- ref: Referencia
- supplier: Proveedor
- supplierRef: Ref. proveedor
- serialNumber: Num. serie
- shortIssued: F. emisión
- serial: Serie
- file: Fichero
- issued: Fecha emisión
- isBooked: Conciliada
- awb: AWB
- amount: Importe
- card:
- issued: Fecha emisión
- amount: Importe
- client: Cliente
- company: Empresa
- customerCard: Ficha del cliente
- ticketList: Listado de tickets
- vat: Iva
- dueDay: Fecha de vencimiento
- summary:
- supplier: Proveedor
- supplierRef: Ref. proveedor
- currency: Divisa
- docNumber: Número documento
- issued: Fecha de expedición
- operated: Fecha operación
- bookEntried: Fecha asiento
- bookedDate: Fecha contable
- sage: Retención sage
- vat: Iva no deducible
- company: Empresa
- booked: Contabilizada
- expense: Gasto
- taxableBase: Base imp.
- rate: Tasa
- sageTransaction: Sage transación
- dueDay: Fecha
- bank: Caja
- amount: Importe
- foreignValue: Divisa
- dueTotal: Vencimiento
- code: Código
- net: Neto
- stems: Tallos
- country: País
department:
pageTitles:
basicData: Basic data
@@ -881,6 +749,9 @@ worker:
timeControl: Control de horario
locker: Taquilla
balance: Balance
+ formation: Formación
+ medical: Mutua
+ operator: Operario
list:
name: Nombre
email: Email
@@ -892,6 +763,7 @@ worker:
newWorker: Nuevo trabajador
card:
workerId: ID Trabajador
+ user: Usuario
name: Nombre
email: Correo personal
phone: Teléfono
@@ -951,6 +823,15 @@ worker:
amount: Importe
remark: Bonficado
hasDiploma: Diploma
+ medical:
+ tableVisibleColumns:
+ date: Fecha
+ time: Hora
+ center: Centro de Formación
+ invoice: Factura
+ amount: Importe
+ isFit: Apto
+ remark: Observaciones
imageNotFound: No se ha encontrado la imagen
balance:
tableVisibleColumns:
@@ -959,7 +840,30 @@ worker:
debit: Debe
credit: Haber
concept: Concepto
+ operator:
+ numberOfWagons: Número de vagones
+ train: tren
+ itemPackingType: Tipo de embalaje
+ warehouse: Almacén
+ sector: Sector
+ labeler: Impresora
+ linesLimit: Líneas límite
+ volumeLimit: Volumen límite
+ sizeLimit: Tamaño límite
+ isOnReservationMode: Modo de reserva
+ machine: Máquina
+
wagon:
+ pageTitles:
+ wagons: Vagones
+ wagonsList: Listado vagones
+ wagonCreate: Crear tipo
+ wagonEdit: Editar tipo
+ typesList: Listado tipos
+ typeCreate: Crear tipo
+ typeEdit: Editar tipo
+ wagonCounter: Contador de carros
+ wagonTray: Listado bandejas
type:
name: Nombre
submit: Guardar
@@ -988,21 +892,6 @@ wagon:
minHeightBetweenTrays: 'La distancia mínima entre bandejas es '
maxWagonHeight: 'La altura máxima del vagón es '
uncompleteTrays: Hay bandejas sin completar
-route:
- cmr:
- list:
- results: resultados
- cmrFk: Id CMR
- hasCmrDms: Gestdoc
- 'true': Sí
- 'false': 'No'
- ticketFk: Id ticket
- routeFk: Id ruta
- country: País
- clientFk: Id cliente
- shipped: Fecha preparación
- viewCmr: Ver CMR
- downloadCmrs: Descargar CMRs
supplier:
list:
payMethod: Método de pago
@@ -1018,6 +907,7 @@ supplier:
account: Cuenta
payMethod: Método de pago
payDay: Dia de pago
+ country: País
summary:
responsible: Responsable
notes: Notas
@@ -1116,6 +1006,7 @@ travel:
warehouseOut: Alm.entrada
totalEntries: ∑
totalEntriesTooltip: Entradas totales
+ daysOnward: Días de llegada en adelante
summary:
confirmed: Confirmado
entryId: Id entrada
@@ -1191,7 +1082,7 @@ item:
producer: Productor
landed: F. entrega
fixedPrice:
- itemId: ID Artículo
+ itemFk: ID Artículo
groupingPrice: Precio grouping
packingPrice: Precio packing
hasMinPrice: Tiene precio mínimo
@@ -1266,6 +1157,7 @@ components:
active: Activo
visible: Visible
floramondo: Floramondo
+ showBadDates: Ver items a futuro
userPanel:
copyToken: Token copiado al portapapeles
settings: Configuración
diff --git a/src/layouts/MainLayout.vue b/src/layouts/MainLayout.vue
index 88c5ee293..51cd20071 100644
--- a/src/layouts/MainLayout.vue
+++ b/src/layouts/MainLayout.vue
@@ -5,7 +5,7 @@ const quasar = useQuasar();
-
+
diff --git a/src/pages/Account/AccountConnections.vue b/src/pages/Account/AccountConnections.vue
index 4d3450665..057745831 100644
--- a/src/pages/Account/AccountConnections.vue
+++ b/src/pages/Account/AccountConnections.vue
@@ -27,15 +27,15 @@ const filter = {
order: 'created DESC',
};
-const urlPath = 'AccessTokens';
+const urlPath = 'VnTokens';
const refresh = () => paginateRef.value.fetch();
const navigate = (id) => router.push({ name: 'AccountSummary', params: { id } });
-const killSession = async (id) => {
+const killSession = async ({ userId, created }) => {
try {
- await axios.delete(`${urlPath}/${id}`);
+ await axios.post(`${urlPath}/killSession`, { userId, created });
paginateRef.value.fetch();
notify(t('Session killed'), 'positive');
} catch (error) {
@@ -84,7 +84,7 @@ const killSession = async (id) => {
openConfirmationModal(
t('Session will be killed'),
t('Are you sure you want to continue?'),
- () => killSession(row.id)
+ () => killSession(row)
)
"
outline
diff --git a/src/pages/Account/AccountList.vue b/src/pages/Account/AccountList.vue
index d698596b9..72c445fa9 100644
--- a/src/pages/Account/AccountList.vue
+++ b/src/pages/Account/AccountList.vue
@@ -5,11 +5,14 @@ import VnTable from 'components/VnTable/VnTable.vue';
import VnSearchbar from 'components/ui/VnSearchbar.vue';
import AccountSummary from './Card/AccountSummary.vue';
import { useSummaryDialog } from 'src/composables/useSummaryDialog';
-
+import AccountFilter from './AccountFilter.vue';
+import RightMenu from 'src/components/common/RightMenu.vue';
const { t } = useI18n();
const { viewSummary } = useSummaryDialog();
const tableRef = ref();
-
+const filter = {
+ include: { relation: 'role', scope: { fields: ['id', 'name'] } },
+};
const columns = computed(() => [
{
align: 'left',
@@ -18,27 +21,31 @@ const columns = computed(() => [
isId: true,
field: 'id',
cardVisible: true,
- columnFilter: {
- component: 'select',
- name: 'search',
- attrs: {
- url: 'VnUsers/preview',
- fields: ['id', 'name'],
- },
- },
},
{
align: 'left',
- name: 'username',
+ name: 'roleFk',
+ label: t('role'),
+ columnFilter: {
+ component: 'select',
+ name: 'roleFk',
+ attrs: {
+ url: 'VnRoles',
+ optionValue: 'id',
+ optionLabel: 'name',
+ },
+ },
+ format: ({ role }, dashIfEmpty) => dashIfEmpty(role?.name),
+ },
+ {
+ align: 'left',
+ name: 'nickname',
label: t('Nickname'),
isTitle: true,
component: 'input',
columnField: {
component: null,
},
- columnFilter: {
- inWhere: true,
- },
cardVisible: true,
create: true,
},
@@ -50,9 +57,6 @@ const columns = computed(() => [
columnField: {
component: null,
},
- columnFilter: {
- inWhere: true,
- },
cardVisible: true,
create: true,
},
@@ -104,17 +108,25 @@ const exprBuilder = (param, value) => {
:expr-builder="exprBuilder"
:label="t('account.search')"
:info="t('account.searchInfo')"
+ :filter="filter"
/>
-
+
+
+
+
+
diff --git a/src/pages/Account/Card/AccountBasicData.vue b/src/pages/Account/Card/AccountBasicData.vue
index f38299f9e..f1cdaf9df 100644
--- a/src/pages/Account/Card/AccountBasicData.vue
+++ b/src/pages/Account/Card/AccountBasicData.vue
@@ -2,6 +2,7 @@
import { useRoute } from 'vue-router';
import { useI18n } from 'vue-i18n';
import VnSelect from 'src/components/common/VnSelect.vue';
+import VnSelectEnum from 'src/components/common/VnSelectEnum.vue';
import FormModel from 'components/FormModel.vue';
import VnInput from 'src/components/common/VnInput.vue';
import { ref, watch } from 'vue';
@@ -24,7 +25,7 @@ watch(
+
diff --git a/src/pages/Account/Card/AccountCard.vue b/src/pages/Account/Card/AccountCard.vue
index 67fa15898..119a7fd07 100644
--- a/src/pages/Account/Card/AccountCard.vue
+++ b/src/pages/Account/Card/AccountCard.vue
@@ -10,7 +10,7 @@ const { t } = useI18n();