diff --git a/.gitignore b/.gitignore index 213384ef5..617169f6f 100644 --- a/.gitignore +++ b/.gitignore @@ -29,5 +29,5 @@ yarn-error.log* *.sln # Cypress directories and files -/tests/cypress/videos -/tests/cypress/screenshots \ No newline at end of file +/test/cypress/videos +/test/cypress/screenshots diff --git a/src/components/CrudModel.vue b/src/components/CrudModel.vue index 940b72ff0..58b4146bf 100644 --- a/src/components/CrudModel.vue +++ b/src/components/CrudModel.vue @@ -1,6 +1,6 @@ diff --git a/src/components/ui/VnPaginate.vue b/src/components/ui/VnPaginate.vue index 0111366f5..655f37059 100644 --- a/src/components/ui/VnPaginate.vue +++ b/src/components/ui/VnPaginate.vue @@ -78,6 +78,10 @@ const props = defineProps({ type: String, default: '', }, + keyData: { + type: String, + default: undefined, + }, }); const emit = defineEmits(['onFetch', 'onPaginate', 'onChange']); @@ -255,7 +259,7 @@ defineExpose({ :disable="disableInfiniteScroll || !store.hasMoreData" v-bind="$attrs" > - +
diff --git a/src/composables/useArrayData.js b/src/composables/useArrayData.js index d7838d58e..3268939de 100644 --- a/src/composables/useArrayData.js +++ b/src/composables/useArrayData.js @@ -170,10 +170,9 @@ export function useArrayData(key, userOptions) { async function addOrder(field, direction = 'ASC') { const newOrder = field + ' ' + direction; - let order = store.order || []; - if (typeof order == 'string') order = [order]; + const order = toArray(store.order); - let index = order.findIndex((o) => o.split(' ')[0] === field); + let index = getOrderIndex(order, field); if (index > -1) { order[index] = newOrder; } else { @@ -190,16 +189,24 @@ export function useArrayData(key, userOptions) { } async function deleteOrder(field) { - let order = store.order ?? []; - if (typeof order == 'string') order = [order]; - - const index = order.findIndex((o) => o.split(' ')[0] === field); + const order = toArray(store.order); + const index = getOrderIndex(order, field); if (index > -1) order.splice(index, 1); store.order = order; fetch({}); } + function getOrderIndex(order, field) { + return order.findIndex((o) => o.split(' ')[0] === field); + } + + function toArray(str = []) { + if (!str) return []; + if (Array.isArray(str)) return str; + if (typeof str === 'string') return str.split(',').map((item) => item.trim()); + } + function sanitizerParams(params, exprBuilder) { for (const param in params) { if (params[param] === '' || params[param] === null) { @@ -290,8 +297,7 @@ export function useArrayData(key, userOptions) { Object.assign(params, store.userParams); if (params.filter) params.filter.skip = store.skip; - if (store?.order && typeof store?.order == 'string') store.order = [store.order]; - if (store.order?.length) params.filter.order = [...store.order]; + if (store.order) params.filter.order = toArray(store.order); else delete params.filter.order; return { filter, params, limit: filter.limit }; diff --git a/src/css/app.scss b/src/css/app.scss index 69aa7c6bd..7296b079f 100644 --- a/src/css/app.scss +++ b/src/css/app.scss @@ -312,11 +312,11 @@ input::-webkit-inner-spin-button { } .q-item > .q-item__section:has(.q-checkbox) { - max-width: min-content; + max-width: fit-content; } .row > .column:has(.q-checkbox) { - max-width: min-content; + max-width: fit-content; } .q-field__inner { .q-field__control { diff --git a/src/i18n/locale/en.yml b/src/i18n/locale/en.yml index 1e22a07d4..8e458df97 100644 --- a/src/i18n/locale/en.yml +++ b/src/i18n/locale/en.yml @@ -1,10 +1,11 @@ globals: lang: es: Spanish - en: English - quantity: Quantity + en: English language: Language + quantity: Quantity entity: Entity + preview: Preview user: User details: Details collapseMenu: Collapse lateral menu @@ -36,7 +37,6 @@ globals: confirm: Confirm assign: Assign back: Back - downloadPdf: Download PDF yes: 'Yes' no: 'No' noChanges: No changes to save @@ -60,6 +60,7 @@ globals: downloadCSVSuccess: CSV downloaded successfully reference: Reference agency: Agency + entry: Entry warehouseOut: Warehouse Out warehouseIn: Warehouse In landed: Landed @@ -68,11 +69,11 @@ globals: amount: Amount packages: Packages download: Download + downloadPdf: Download PDF selectRows: 'Select all { numberRows } row(s)' allRows: 'All { numberRows } row(s)' markAll: Mark all requiredField: Required field - valueCantBeEmpty: Value cannot be empty class: clase type: Type reason: reason @@ -82,6 +83,9 @@ globals: warehouse: Warehouse company: Company fieldRequired: Field required + valueCantBeEmpty: Value cannot be empty + Value can't be blank: Value cannot be blank + Value can't be null: Value cannot be null allowedFilesText: 'Allowed file types: { allowedContentTypes }' smsSent: SMS sent confirmDeletion: Confirm deletion @@ -131,6 +135,26 @@ globals: medium: Medium big: Big email: Email + supplier: Supplier + ticketList: Ticket List + created: Created + worker: Worker + now: Now + name: Name + new: New + comment: Comment + observations: Observations + goToModuleIndex: Go to module index + createInvoiceIn: Create invoice in + myAccount: My account + noOne: No one + maxTemperature: Max + minTemperature: Min + changePass: Change password + deleteConfirmTitle: Delete selected elements + changeState: Change state + raid: 'Raid {daysInForward} days' + isVies: Vies pageTitles: logIn: Login addressEdit: Update address @@ -152,13 +176,14 @@ globals: subRoles: Subroles inheritedRoles: Inherited Roles customers: Customers + customerCreate: New customer + createCustomer: Create customer + createOrder: New order list: List webPayments: Web Payments extendedList: Extended list notifications: Notifications defaulter: Defaulter - customerCreate: New customer - createOrder: New order fiscalData: Fiscal data billingData: Billing data consignees: Consignees @@ -194,27 +219,28 @@ globals: claims: Claims claimCreate: New claim lines: Lines - photos: Photos development: Development + photos: Photos action: Action invoiceOuts: Invoice out negativeBases: Negative Bases globalInvoicing: Global invoicing invoiceOutCreate: Create invoice out + order: Orders + orderList: List + orderCreate: New order + catalog: Catalog + volume: Volume shelving: Shelving shelvingList: Shelving List shelvingCreate: New shelving invoiceIns: Invoices In invoiceInCreate: Create invoice in vat: VAT + labeler: Labeler dueDay: Due day intrastat: Intrastat corrective: Corrective - order: Orders - orderList: List - orderCreate: New order - catalog: Catalog - volume: Volume workers: Workers workerCreate: New worker department: Department @@ -227,10 +253,10 @@ globals: wagonsList: Wagons List wagonCreate: Create wagon wagonEdit: Edit wagon + wagonCounter: Trolley counter typesList: Types List typeCreate: Create type typeEdit: Edit type - wagonCounter: Trolley counter roadmap: Roadmap stops: Stops routes: Routes @@ -239,21 +265,16 @@ globals: routeCreate: New route RouteRoadmap: Roadmaps RouteRoadmapCreate: Create roadmap + RouteExtendedList: Router autonomous: Autonomous suppliers: Suppliers supplier: Supplier - expedition: Expedition - services: Service - components: Components - pictures: Pictures - packages: Packages - tracking: Tracking - labeler: Labeler supplierCreate: New supplier accounts: Accounts addresses: Addresses agencyTerm: Agency agreement travel: Travels + create: Create extraCommunity: Extra community travelCreate: New travel history: Log @@ -261,14 +282,13 @@ globals: items: Items diary: Diary tags: Tags - create: Create - buyRequest: Buy requests fixedPrice: Fixed prices + buyRequest: Buy requests wasteBreakdown: Waste breakdown itemCreate: New item - barcode: Barcodes tax: Tax botanical: Botanical + barcode: Barcodes itemTypeCreate: New item type family: Item Type lastEntries: Last entries @@ -284,13 +304,20 @@ globals: formation: Formation locations: Locations warehouses: Warehouses - saleTracking: Sale tracking roles: Roles connections: Connections acls: ACLs mailForwarding: Mail forwarding mailAlias: Mail alias privileges: Privileges + observation: Notes + expedition: Expedition + saleTracking: Sale tracking + services: Service + tracking: Tracking + components: Components + pictures: Pictures + packages: Packages ldap: LDAP samba: Samba twoFactor: Two factor @@ -301,27 +328,12 @@ globals: serial: Serial medical: Mutual pit: IRPF - RouteExtendedList: Router wasteRecalc: Waste recaclulate operator: Operator parking: Parking - supplier: Supplier - created: Created - worker: Worker - now: Now - name: Name - new: New - comment: Comment - observations: Observations - goToModuleIndex: Go to module index unsavedPopup: title: Unsaved changes will be lost subtitle: Are you sure exit without saving? - createInvoiceIn: Create invoice in - myAccount: My account - noOne: No one - maxTemperature: Max - minTemperature: Min params: clientFk: Client id salesPersonFk: Sales person @@ -339,19 +351,13 @@ globals: supplierFk: Supplier supplierRef: Supplier ref serial: Serial - amount: Importe + amount: Amount awbCode: AWB correctedFk: Rectified correctingFk: Rectificative daysOnward: Days onward countryFk: Country companyFk: Company - changePass: Change password - setPass: Set password - deleteConfirmTitle: Delete selected elements - changeState: Change state - raid: 'Raid {daysInForward} days' - isVies: Vies errors: statusUnauthorized: Access denied statusInternalServerError: An internal server error has ocurred @@ -491,21 +497,6 @@ invoiceOut: comercial: Comercial errors: downloadCsvFailed: CSV download failed -shelving: - list: - parking: Parking - priority: Priority - newShelving: New Shelving - summary: - recyclable: Recyclable -parking: - pickingOrder: Picking order - sector: Sector - row: Row - column: Column - searchBar: - info: You can search by parking code - label: Search parking... department: chat: Chat bossDepartment: Boss Department @@ -697,6 +688,9 @@ supplier: consumption: entry: Entry travel: + search: Search travel + searchInfo: You can search by travel id or name + id: Id travelList: tableVisibleColumns: ref: Reference @@ -727,62 +721,6 @@ travel: destination: Destination thermograph: Thermograph travelFileDescription: 'Travel id { travelId }' -item: - descriptor: - buyer: Buyer - color: Color - category: Category - available: Available - warehouseText: 'Calculated on the warehouse of { warehouseName }' - itemDiary: Item diary - list: - id: Identifier - stems: Stems - category: Category - typeName: Type - isActive: Active - userName: Buyer - weightByPiece: Weight/Piece - stemMultiplier: Multiplier - fixedPrice: - itemFk: Item ID - groupingPrice: Grouping price - packingPrice: Packing price - hasMinPrice: Has min price - minPrice: Min price - started: Started - ended: Ended - create: - priority: Priority - buyRequest: - requester: Requester - requested: Requested - attender: Atender - achieved: Achieved - concept: Concept - summary: - otherData: Other data - tax: Tax - botanical: Botanical - barcode: Barcode - completeName: Complete name - family: Familiy - stems: Stems - multiplier: Multiplier - buyer: Buyer - doPhoto: Do photo - intrastatCode: Intrastat code - ref: Reference - relevance: Relevance - weight: Weight (gram)/stem - units: Units/box - expense: Expense - generic: Generic - recycledPlastic: Recycled plastic - nonRecycledPlastic: Non recycled plastic - minSalesQuantity: Min sales quantity - genus: Genus - specie: Specie components: topbar: {} itemsFilterPanel: diff --git a/src/i18n/locale/es.yml b/src/i18n/locale/es.yml index 0d308bd84..f59821f28 100644 --- a/src/i18n/locale/es.yml +++ b/src/i18n/locale/es.yml @@ -5,6 +5,7 @@ globals: language: Idioma quantity: Cantidad entity: Entidad + preview: Vista previa user: Usuario details: Detalles collapseMenu: Contraer menú lateral @@ -54,11 +55,12 @@ globals: today: Hoy yesterday: Ayer dateFormat: es-ES - noSelectedRows: No tienes ninguna línea seleccionada microsip: Abrir en MicroSIP + noSelectedRows: No tienes ninguna línea seleccionada downloadCSVSuccess: Descarga de CSV exitosa reference: Referencia agency: Agencia + entry: Entrada warehouseOut: Alm. salida warehouseIn: Alm. entrada landed: F. entrega @@ -133,6 +135,26 @@ globals: medium: Mediano/a big: Grande email: Correo + supplier: Proveedor + ticketList: Listado de tickets + created: Fecha creación + worker: Trabajador + now: Ahora + name: Nombre + new: Nuevo + comment: Comentario + observations: Observaciones + goToModuleIndex: Ir al índice del módulo + createInvoiceIn: Crear factura recibida + myAccount: Mi cuenta + noOne: Nadie + maxTemperature: Máx + minTemperature: Mín + changePass: Cambiar contraseña + deleteConfirmTitle: Eliminar los elementos seleccionados + changeState: Cambiar estado + raid: 'Redada {daysInForward} días' + isVies: Vies pageTitles: logIn: Inicio de sesión addressEdit: Modificar consignatario @@ -155,17 +177,17 @@ globals: inheritedRoles: Roles heredados customers: Clientes customerCreate: Nuevo cliente + createCustomer: Crear cliente createOrder: Nuevo pedido list: Listado webPayments: Pagos Web extendedList: Listado extendido notifications: Notificaciones defaulter: Morosos - createCustomer: Crear cliente fiscalData: Datos fiscales billingData: Forma de pago consignees: Consignatarios - 'address-create': Nuevo consignatario + address-create: Nuevo consignatario notes: Notas credits: Créditos greuges: Greuges @@ -231,10 +253,10 @@ globals: wagonsList: Listado vagones wagonCreate: Crear tipo wagonEdit: Editar tipo + wagonCounter: Contador de carros typesList: Listado tipos typeCreate: Crear tipo typeEdit: Editar tipo - wagonCounter: Contador de carros roadmap: Troncales stops: Paradas routes: Rutas @@ -243,8 +265,8 @@ globals: routeCreate: Nueva ruta RouteRoadmap: Troncales RouteRoadmapCreate: Crear troncal - autonomous: Autónomos RouteExtendedList: Enrutador + autonomous: Autónomos suppliers: Proveedores supplier: Proveedor supplierCreate: Nuevo proveedor @@ -309,23 +331,9 @@ globals: wasteRecalc: Recalcular mermas operator: Operario parking: Parking - supplier: Proveedor - created: Fecha creación - worker: Trabajador - now: Ahora - name: Nombre - new: Nuevo - comment: Comentario - observations: Observaciones - goToModuleIndex: Ir al índice del módulo unsavedPopup: title: Los cambios que no haya guardado se perderán subtitle: ¿Seguro que quiere salir sin guardar? - createInvoiceIn: Crear factura recibida - myAccount: Mi cuenta - noOne: Nadie - maxTemperature: Máx - minTemperature: Mín params: clientFk: Id cliente salesPersonFk: Comercial @@ -348,12 +356,6 @@ globals: packing: ITP countryFk: País companyFk: Empresa - changePass: Cambiar contraseña - setPass: Establecer contraseña - deleteConfirmTitle: Eliminar los elementos seleccionados - changeState: Cambiar estado - raid: 'Redada {daysInForward} días' - isVies: Vies errors: statusUnauthorized: Acceso denegado statusInternalServerError: Ha ocurrido un error interno del servidor @@ -448,11 +450,15 @@ ticket: attender: Consignatario create: address: Dirección -invoiceOut: - card: - issued: Fecha emisión - customerCard: Ficha del cliente - ticketList: Listado de tickets +order: + field: + salesPersonFk: Comercial + form: + clientFk: Cliente + addressFk: Dirección + agencyModeFk: Agencia + list: + newOrder: Nuevo Pedido summary: issued: Fecha dued: Fecha límite @@ -463,47 +469,6 @@ invoiceOut: fee: Cuota tickets: Tickets totalWithVat: Importe - globalInvoices: - errors: - chooseValidClient: Selecciona un cliente válido - chooseValidCompany: Selecciona una empresa válida - chooseValidPrinter: Selecciona una impresora válida - chooseValidSerialType: Selecciona una tipo de serie válida - fillDates: La fecha de la factura y la fecha máxima deben estar completas - invoiceDateLessThanMaxDate: La fecha de la factura no puede ser menor que la fecha máxima - invoiceWithFutureDate: Existe una factura con una fecha futura - noTicketsToInvoice: No existen tickets para facturar - criticalInvoiceError: Error crítico en la facturación proceso detenido - invalidSerialTypeForAll: El tipo de serie debe ser global cuando se facturan todos los clientes - table: - addressId: Id dirección - streetAddress: Dirección fiscal - statusCard: - percentageText: '{getPercentage}% {getAddressNumber} de {getNAddresses}' - pdfsNumberText: '{nPdfs} de {totalPdfs} PDFs' - negativeBases: - clientId: Id cliente - base: Base - active: Activo - hasToInvoice: Facturar - verifiedData: Datos comprobados - comercial: Comercial - errors: - downloadCsvFailed: Error al descargar CSV -shelving: - list: - parking: Parking - priority: Prioridad - newShelving: Nuevo Carro - summary: - recyclable: Reciclable -parking: - pickingOrder: Orden de recogida - row: Fila - column: Columna - searchBar: - info: Puedes buscar por código de parking - label: Buscar parking... department: chat: Chat bossDepartment: Jefe de departamento @@ -693,6 +658,9 @@ supplier: consumption: entry: Entrada travel: + search: Buscar envío + searchInfo: Buscar envío por id o nombre + id: Id travelList: tableVisibleColumns: ref: Referencia @@ -723,62 +691,6 @@ travel: destination: Destino thermograph: Termógrafo travelFileDescription: 'Id envío { travelId }' -item: - descriptor: - buyer: Comprador - color: Color - category: Categoría - available: Disponible - warehouseText: 'Calculado sobre el almacén de { warehouseName }' - itemDiary: Registro de compra-venta - list: - id: Identificador - stems: Tallos - category: Reino - typeName: Tipo - isActive: Activo - weightByPiece: Peso (gramos)/tallo - userName: Comprador - stemMultiplier: Multiplicador - fixedPrice: - itemFk: ID Artículo - groupingPrice: Precio grouping - packingPrice: Precio packing - hasMinPrice: Tiene precio mínimo - minPrice: Precio min - started: Inicio - ended: Fin - create: - priority: Prioridad - summary: - otherData: Otros datos - tax: IVA - botanical: Botánico - barcode: Código de barras - completeName: Nombre completo - family: Familia - stems: Tallos - multiplier: Multiplicador - buyer: Comprador - doPhoto: Hacer foto - intrastatCode: Código intrastat - ref: Referencia - relevance: Relevancia - weight: Peso (gramos)/tallo - units: Unidades/caja - expense: Gasto - generic: Genérico - recycledPlastic: Plástico reciclado - nonRecycledPlastic: Plástico no reciclado - minSalesQuantity: Cantidad mínima de venta - genus: Genus - specie: Specie - buyRequest: - requester: Solicitante - requested: Solicitado - attender: Comprador - achieved: Conseguido - concept: Concepto components: topbar: {} itemsFilterPanel: diff --git a/src/pages/Customer/Card/CustomerConsumption.vue b/src/pages/Customer/Card/CustomerConsumption.vue index 640e37ed3..f0d8dea47 100644 --- a/src/pages/Customer/Card/CustomerConsumption.vue +++ b/src/pages/Customer/Card/CustomerConsumption.vue @@ -152,7 +152,8 @@ const updateDateParams = (value, params) => { v-if="campaignList" data-key="CustomerConsumption" url="Clients/consumption" - :order="['itemTypeFk', 'itemName', 'itemSize', 'description']" + :order="['itemTypeFk', 'itemName', 'itemSize', 'description']" + :filter="{ where: { clientFk: route.params.id } }" :columns="columns" search-url="consumption" :user-params="userParams" diff --git a/src/pages/Customer/Card/CustomerDescriptor.vue b/src/pages/Customer/Card/CustomerDescriptor.vue index cb49109d0..4a064843a 100644 --- a/src/pages/Customer/Card/CustomerDescriptor.vue +++ b/src/pages/Customer/Card/CustomerDescriptor.vue @@ -187,14 +187,18 @@ const debtWarning = computed(() => { - {{ t('Go to user') }} + {{ t('globals.pageTitles.createOrder') }} { }; const clientFk = { ticket: 'clientId', - order: 'clientFk', }; const key = clientFk[type]; if (!key) return; @@ -70,11 +69,6 @@ const openCreateForm = (type) => { {{ t('globals.pageTitles.createTicket') }} - - - {{ t('globals.pageTitles.createOrder') }} - - {{ t('Send SMS') }} diff --git a/src/pages/Customer/Card/CustomerUnpaid.vue b/src/pages/Customer/Card/CustomerUnpaid.vue index 18b12c60c..f76e35821 100644 --- a/src/pages/Customer/Card/CustomerUnpaid.vue +++ b/src/pages/Customer/Card/CustomerUnpaid.vue @@ -50,7 +50,8 @@ const filterClientFindOne = { >