diff --git a/CHANGELOG.md b/CHANGELOG.md index fbe18a10ab4..58b68b7fa08 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,1519 +1,1804 @@ +# Version 25.06 - 2025-02-18 + +### Added ๐ + +- chore: refs #7405 remove examples documentation by:jorgep +- chore: refs #7405 remove VitePress cache files and update .gitignore by:jorgep +- chore: refs #8316 remove search and searchInfo entries from shelving in English and Spanish locales by:jtubau +- feat: #8258 added hover and description to uppercase button by:PAU ROVIRA ROSALENY +- feat: add addressFk by:Javier Segarra +- feat: add inactive car icon by:jorgep +- feat: downgrade pnpm by:Javier Segarra +- feat: new command by:Javier Segarra +- feat: refs #6629 addressObservation by:robert +- feat: refs #6629 change values by:robert +- feat: refs #6629 customerAddressEdit by:robert +- feat: refs #6629 delete consolelog by:robert +- feat: refs #6629 traduction message by:robert +- feat: refs #6629 update by:robert +- feat: refs #6822 by:robert +- feat: refs #6822 change request by:robert +- feat: refs #6822 change traduction Partial delay (origin/6822-changeTitlePartialDelay) by:robert +- feat: refs #6822 redirection by:robert +- feat: refs #6943 addressPropagate by:Javier Segarra +- feat: refs #6943 updateAndEmit param as object by:Javier Segarra +- feat: refs #7065 created unit tests for UserPanel by:provira +- feat: refs #7068 created VnVisibleColumns unit test by:Jon +- feat: refs #7103 created test for VnSearchbar by:provira +- feat: refs #7134 #7124 handle columns by:Javier Segarra +- feat: refs #7134 #7124 handle filter by:Javier Segarra +- feat: refs #7134 #7134 Create new route by:Javier Segarra +- feat: refs #7134 #7134 Create SupplierBalance layout by:Javier Segarra +- feat: refs #7134 #7134 split newPayment by:Javier Segarra +- feat: refs #7134 add bank by:Javier Segarra +- feat: refs #7134 apply supplierBalanceFilter by:Javier Segarra +- feat: refs #7134 default currency parameter by:Javier Segarra +- feat: refs #7134 minor changes by:Javier Segarra +- feat: refs #7134 order by:Javier Segarra +- feat: refs #7134 perf VnTable by:Javier Segarra +- feat: refs #7134 remove add btn by:Javier Segarra +- feat: refs #7134 unremovableParams by:Javier Segarra +- feat: refs #7134 use tableFooter by:Javier Segarra +- feat: refs #7134 use VnAccountNumber by:Javier Segarra +- feat: refs #7134 vnTable setTableFooter by:Javier Segarra +- feat: refs #7184 added myTeam filter at WorkerFilter by:Jon +- feat: refs #7196 update vite and q-calendar by:alexm +- feat: refs #7305 deleted warnings by:Jon +- feat: refs #7308 remove warning by:Javier Segarra +- feat: refs #7317 deleted warnings in fiscalData and dms by:Jon +- feat: refs #7322 add address selection for ticket transfer by:jtubau +- feat: refs #7405 add initial documentation and components for Lilium by:jorgep +- feat: refs #7405 add navigation links and documentation for useArrayData composable by:jorgep +- feat: refs #7826 add error handling and refresh icon to NavBar by:Javier Segarra +- feat: refs #8077 change request by:robert +- feat: refs #8077 changes request by:robert +- feat: refs #8077 sumDefaulter by:robert +- feat: refs #8120 added new style to summary popups by:Jon +- feat: refs #8120 use new prop in the requierd modules by:Jon +- feat: refs #8197 create advancedMenu and add in VnSection by:alexm +- feat: refs #8316 added order param by:jtubau +- feat: refs #8316 add slots on VnTable from VnFilterPanel by:alexm +- feat: refs #8316 parking inside shelving by:alexm +- feat: refs #8322 added RouteRoadmap and Agency by:provira +- feat: refs #8322 fix route.js and unify with /agency by:alexm +- feat: refs #8322 fix route.js and unify with /roadmap by:alexm +- feat: refs #8339 define global.spreview by:Javier Segarra +- feat: refs #8381 add carrier field to travel thermographs and update localization by:jgallego +- feat: refs #8387 changes by:robert +- feat: refs #8387 changes request by:robert +- feat: refs #8387 crudModel by:robert +- feat: refs #8387 refs#8387 change request by:robert +- feat: refs #8395 added computed to calculate and display amounts by:provira +- feat: refs #8395 added total column in invoiceInVat by:provira +- feat: refs #8398 modify previous changes by:robert +- feat: refs #8398 moveTicketsFuture by:robert +- feat: refs #8409 added VnSelectSupplier by:Jon +- feat: refs #8410 added new feature to module searchbar by:provira +- feat: refs #8418 add data-cy attribute for print labels button in EntryBuysTableDialog by:jtubau +- feat: refs #8450 added new version by:Jon +- feat: toCurrency in risk icon by:Javier Segarra +- feat: update quasar version by:Javier Segarra +- feat: update vitest to 1.0 by:Javier Segarra +- feat: update vue to 3.5 by:Javier Segarra +- style: customerDescriptor by:Javier Segarra +- style: refs #6943 order imports by:Javier Segarra + +### Changed ๐ฆ + +- feat: refs #7134 perf VnTable by:Javier Segarra +- perf: pnpm-lock by:Javier Segarra +- perf: refs #7134 #7134 changes by:Javier Segarra +- perf: refs #7134 #7134 fix filter panel by:Javier Segarra +- perf: refs #7134 #7134 global dialog newPayment and composable getRisk by:Javier Segarra +- perf: refs #7134 currencies fetch by:Javier Segarra +- perf: refs #7134 format columns by:Javier Segarra +- perf: refs #7134 imports by:Javier Segarra +- perf: refs #7134 use ForModelPopup by:Javier Segarra +- perf: refs #7134 use map-key by:Javier Segarra +- perf: refs #7134 use where to get only EUR currency by:Javier Segarra +- perf: refs #7196 update eslint by:alexm +- perf: refs #7308 call 1 time useSession by:Javier Segarra +- perf: refs #7826 code onError by:Javier Segarra +- perf: refs #7826 improve condition by:Javier Segarra +- perf: refs #8197 default is object by:alexm +- perf: refs #8197 fix and imrpove filters by:alexm +- perf: refs #8197 perf by:alexm +- perf: refs #8339 minor changes by:Javier Segarra +- perf: refs #8339 removew preview tag by:Javier Segarra +- perf: use util in OutLayout by:Javier Segarra +- perf: vitest to 0.34.0 by:Javier Segarra +- refactor: advancedMenu button inside searchbar by:alexm +- refactor: move remaining data to descriptorMenu by:Jon +- refactor: refs #6822 transferEntry moved to descriptor menu by:robert +- refactor: refs #7068 adjust variables by:Jon +- refactor: refs #7068 requested changes by:Jon +- refactor: refs #7317 requested changes by:Jon +- refactor: refs #7322 extract repeated functions and create tests by:jtubau +- refactor: refs #7322 update API functions to accept filters for enhanced data retrieval by:jtubau +- refactor: refs #7322 update getAgencies to handle client and return default agency by:jtubau +- refactor: refs #8120 change prop and classes' names by:Jon +- refactor: refs #8120 requested changes by:Jon +- refactor: refs #8120 use only defineProps by:Jon +- refactor: refs #8316 added shelvingCardBeta and localizations by:jtubau +- refactor: refs #8316 add new localization keys and update existing ones for invoiceIn components by:jtubau +- refactor: refs #8316 add new localization keys and update existing ones for invoiceOut components by:jtubau +- refactor: refs #8316 moved userFilter to array-data-props by:jtubau +- refactor: refs #8316 remove invoiceInSearchbar by:alexm +- refactor: refs #8316 remove unused ItemTypeSearchbar component by:jtubau +- refactor: refs #8316 restore exprBuilder function to filter invoice data by:jtubau +- refactor: refs #8316 restore filter for supplier and related entities in InvoiceInCard by:jtubau +- refactor: refs #8316 unify router item and itemType by:alexm +- refactor: refs #8316 update prefix casing for InvoiceIn component by:jtubau +- refactor: refs #8316 update Spanish translations for ItemsFilterPanel by:jtubau +- refactor: refs #8316 used VnSection and VnBetaCard by:jtubau +- refactor: refs #8316 used VnSection and VnCardBeta by:jtubau +- refactor: refs #8316 used VnSection and VnCardBeta on ItemCard by:jtubau +- refactor: refs #8322 changed Route component to use VnSection/VnCardBeta by:provira +- refactor: refs #8322 changed Travel component to use VnSection/VnCardBeta by:provira +- refactor: refs #8351 deleted skip and fixed TicketList e2e by:Jon +- refactor: refs #8351 put appropriate name by:Jon +- refactor: refs #8380 remove unnecessary stubs in VnImg test wrapper by:jtubau +- refactor: refs #8381 update travel data handling in TravelThermographs component by:jgallego +- refactor: refs #8409 deleted unused variable by:Jon +- refactor: refs #8409 use defineModel instead or defineProps by:Jon +- refactor: refs #8410 restructured code by:provira +- refactor: refs #8418 remove commented issue reference from myEntry.spec.js by:jtubau +- refactor: refs #8418 update data-cy attribute for print labels button in EntryBuysTableDialog by:jtubau +- refactor: refs #8418 update selector to use cy.dataCy instead cy.get by:jtubau +- refactor: request changes by:Jon + +### Fixed ๐ ๏ธ + +- feat: refs #8322 fix route.js and unify with /agency by:alexm +- feat: refs #8322 fix route.js and unify with /roadmap by:alexm +- fix: added witdth when opening summary by:Jon +- fix: defineProps not import by:alexm +- fix: deleted duplicate request by:Jon +- fix: fixed descriptor e2e by:Jon +- fix: fixed InvoiceOutList e2e by:Jon +- fix: fixed list and e2e by:Jon +- fix: fixed pagiante by:Jon +- fix: fixed rectificative class by:Jon +- fix: fixed states column in claim list and filter by:Jon +- fix: fixed VnLocation and warnings by:Jon +- fix: fixed wagons e2e (origin/Fix-WagonModuleE2E) by:Jon +- fix: fix grid two by:carlossa +- fix: improve method (origin/warmfix_reload_scriptIsMissing) by:Javier Segarra +- fix: init by:Javier Segarra +- fix: minor cli error by:Javier Segarra +- fix: modified front to show new field by:Jon +- fix: move dialog to descriptorMenu by:Jon +- fix: refs #6553 clean pr by:carlossa +- fix: refs #6553 fix BeforeMount filters by:carlossa +- fix: refs #6553 fix front and translations by:carlossa +- fix: refs #6553 fix pr by:carlossa +- fix: refs #6553 fix PR, fix vnTableCard by:carlossa +- fix: refs #6553 fix qScrollArea by:carlossa +- fix: refs #6553 fix summary by:carlossa +- fix: refs #6553 fix user-filter by:carlossa +- fix: refs #6553 fix vnTable by:carlossa +- fix: refs #6553 fix vnTable css by:carlossa +- fix: refs #6553 front advanced by:carlossa +- fix: refs #6553 front by:carlossa +- fix: refs #6553 label css by:carlossa +- fix: refs #6553 onBeforeMount by:carlossa +- fix: refs #6943 minor changes by:Javier Segarra +- fix: refs #6943 redirect when change addressId by:Javier Segarra +- fix: refs #6943 required by:Javier Segarra +- fix: refs #7065 made consts for repeated values by:provira +- fix: refs #7065 removed unnecessary code by:provira +- fix: refs #7103 removed unused code on spies by:provira +- fix: refs #7103 updated tests for new changes by:provira +- fix: refs #7103 used consts for repeated variables by:provira +- fix: refs #7134 getRiskComposable by:Javier Segarra +- fix: refs #7134 minor change by:Javier Segarra +- fix: refs #7134 params filter by:Javier Segarra +- fix: refs #7134 remove risk by:Javier Segarra +- fix: refs #7134 remove supplierRisk by:Javier Segarra +- fix: refs #7134 solve comments by:Javier Segarra +- fix: refs #7196 not neccessary by:alexm +- fix: refs #7196 sass by:alexm +- fix: refs #7322 handle null responses in client, agency and address fetching by:jtubau +- fix: refs #7826 init by:Javier Segarra +- fix: refs #8120 ticket descriptor & summary by:Jon +- fix: refs #8172 Remove unused row and column fields from ParkingBasicData by:guillermo +- fix: refs #8197 improve code robustness by adding optional chaining and fixing syntax errors by:alexm +- fix: refs #8197 use rightMenu by:alexm +- fix: refs #8197 use RightMenu in subsections by:alexm +- fix: refs #8227 clean pr (origin/8227-warmfixRoute) by:carlossa +- fix: refs #8227 fix front descriptor, Form by:carlossa +- fix: refs #8227 warmfix by:carlossa +- fix: refs #8316 advanced-menu by:alexm +- fix: refs #8316 filter by:alexm +- fix: refs #8316 fix broken localizations for entry descriptor menu and items filter panel by:jtubau +- fix: refs #8316 icon by:alexm +- fix: refs #8316 redirections by:alexm +- fix: refs #8316 translations by:alexm +- fix: refs #8316 user-filter by:alexm +- fix: refs #8322 add userFilter by:alexm +- fix: refs #8322 filter and params by:alexm +- fix: refs #8322 fixed route creation url by:provira +- fix: refs #8322 moved filter inside array-data-props by:provira +- fix: refs #8322 use userFilter by:alexm +- fix: refs #8347 remove skip, fix unpaid by:carlossa +- fix: refs #8352 fix datacy by:carlossa +- fix: refs #8352 fix right by:carlossa +- fix: refs #8352 fix rightPanel vnLog by:carlossa +- fix: refs #8381 update travel data fetching to use correct URL and include necessary fields by:jgallego +- fix: refs #8381 update travel data reference in TravelThermographs component by:jgallego +- fix: refs #8395 update label for total column by:provira +- fix: refs #8409 deleted code due to merge by:Jon +- fix: refs #8409 deleted code of merge by:Jon +- fix: refs #8410 removed ref from searching boolean by:provira +- fix: refs #8410 removed unused code by:provira +- fix: refs #8410 removed unused condition by:provira +- fix: refs #8410 removed unused ref by:provira +- fix: refs #8410 simplified searchModule function by:provira +- fix: refs #8418 adjusted route for button click by:jtubau +- fix: refs #8418 correct casing in translation keys for supplier reference and issued date labels by:jtubau +- fix: refs #8419 modified list and fixed e2e by:Jon +- fix: refs #8420 ensure search bar is visible before typing and enable details test by:jtubau +- fix: refs #8422 fixed ItemTag e2e test not working by:provira +- fix: refs #8422 optimized get and dataCy by:provira +- fix: refs #8423 fixed zoneWarehouse e2e test not working by:provira +- fix: refs #8423 removed data-cy usage by:provira +- fix: refs #8423 used dataCy to get data-cy by:provira +- fix: refs #8524 parking section router by:alexm +- fix: refs #8524 parking test (origin/8524-devToTest, 8524-devToTest) by:alexm +- fix: remove console by:Javier Segarra +- fix: replace labels by:Javier Segarra +- fix: rightAdvancedMenu by:alexm +- fix: routeCard use customUrl by:alexm +- fix: show descriptors when click on it by:Javier Segarra +- fix: update query parameters for thermograph routing by:jgallego +- fix: update selector for buyLabel button in myEntry.spec.js (origin/fix-myEntryTest) by:jtubau +- fix: update setupNodeEvents to use async/await for plugin import by:jgallego +- fix: use model by:alexm +- fix: use rightMenu by:alexm +- fix(VnSection): destroy data when unmounted by:alexm +- fix(VnSection): refs #8197 check route by:alexm +- fix(WorkerBusiness): fix card label by:alexm +- fix: workerSummary by:alexm +- perf: refs #7134 #7134 fix filter panel by:Javier Segarra +- perf: refs #8197 fix and imrpove filters by:alexm +- refactor: refs #8316 update prefix casing for InvoiceIn component by:jtubau +- refactor: refs #8351 deleted skip and fixed TicketList e2e by:Jon +- refs #6553 fix business slot by:carlossa +- refs #6553 fix business summary by:carlossa +- refs #6553 fix business summary traductions by:carlossa +- refs #6553 fix front ibject by:carlossa +- refs #6553 fix front trad by:carlossa +- refs #6553 fix names by:carlossa +- refs #6553 fix reactivateWorker by:carlossa +- refs #6553 fix relations by:carlossa +- refs #6553 fix VnTable by:carlossa +- refs #7917 fix routeCard by:carlossa +- revert: refs #7134 change by:Javier Segarra +- revert: refs #7134 customer changes by:Javier Segarra +- revert: vitest to 0.31.1 by:Javier Segarra +- test: fix clientList spec by:Javier Segarra +- test: fix component by:Javier Segarra +- test: fix VnSearchbar by:alexm +- test: refs #6943 fix tests by:Javier Segarra +- test: refs #7308 fix axios.spec.js by:Javier Segarra +- test: refs #8524 fix by:alexm + # Version 25.04 - 2025-01-28 ### Added ๐ -- chore: add task comment by:jorgep -- chore: refs #8198 rollback by:jorgep -- chore: refs #8322 unnecessary prop by:alexm -- feat: refs #7055 added new test case by:provira -- feat: refs #7055 created FilterItemForm test by:provira -- feat: refs #7077 created test for VnInputTime by:provira -- feat: refs #7078 created test for VnJsonValue by:provira -- feat: refs #7087 added more test cases by:provira -- feat: refs #7087 added new test by:provira -- feat: refs #7087 created CardSummary test by:provira -- feat: refs #7088 created test for FetchedTags by:provira -- feat: refs #7202 added new field by:Jon -- feat: refs #7882 Added coords to create a address by:guillermo -- feat: refs #7957 add tooltip and i18n support for search link in VnSearchbar component by:jorgep -- feat: refs #7957 enhance search functionality and improve data filtering logic by:jorgep -- feat: refs #7957 open in new tab by:jorgep -- feat: refs #7957 simplify fn to by:jorgep -- feat: refs #7957 update VnSearchbar component with improved search URL handling and styling enhancements by:jorgep -- feat: refs #8117 filters and values added as needed by:jtubau -- feat: refs #8197 useHasContent and use in VnSection and RightMenu by:alexm -- feat: refs #8219 added invoice out e2e tests by:Jon -- feat: refs #8219 global invoicing e2e by:Jon -- feat: refs #8220 added barcodes e2e test by:Jon -- feat: refs #8220 created items e2e by:Jon -- feat: refs #8220 modified create item form and added respective e2e by:Jon -- feat: refs #8225 added account and invoiceOut modules by:Jon -- feat: refs #8225 added entry module and fixed translations by:Jon -- feat: refs #8225 added invoiceIn and travel module by:Jon -- feat: refs #8225 added moreOptions and use it in customer and ticket summary by:Jon -- feat: refs #8225 added route and shelving module by:Jon -- feat: refs #8225 added worker and zone modules by:Jon -- feat: refs #8225 use it in claim, item and order modules by:Jon -- feat: refs #8258 added button to pass to uppercase by:provira -- feat: refs #8258 added uppercase option to VnInput by:provira -- feat: refs #8258 added uppercase validation on supplier create by:provira -- feat: refs #8298 add price optimum input and update translations for bonus and price optimum by:jgallego -- feat: refs #8316 add entryFilter prop to VnTable component in EntryList by:jtubau -- feat: refs #8322 added department changes by:provira -- feat: refs #8372 workerPBX by:robert -- feat: refs #8381 add initial and final temperature fields to entry forms and summaries by:jgallego -- feat: refs #8381 add initial and final temperature labels in English and Spanish locales by:jgallego -- feat: refs #8381 add toCelsius filter and update temperature fields in entry forms and summaries by:jgallego -- feat: skip tests by:jorgep -- style: refs #7957 update VnSearchbar padding for improved layout by:jorgep +- chore: add task comment by:jorgep +- chore: refs #8198 rollback by:jorgep +- chore: refs #8322 unnecessary prop by:alexm +- feat: refs #7055 added new test case by:provira +- feat: refs #7055 created FilterItemForm test by:provira +- feat: refs #7077 created test for VnInputTime by:provira +- feat: refs #7078 created test for VnJsonValue by:provira +- feat: refs #7087 added more test cases by:provira +- feat: refs #7087 added new test by:provira +- feat: refs #7087 created CardSummary test by:provira +- feat: refs #7088 created test for FetchedTags by:provira +- feat: refs #7202 added new field by:Jon +- feat: refs #7882 Added coords to create a address by:guillermo +- feat: refs #7957 add tooltip and i18n support for search link in VnSearchbar component by:jorgep +- feat: refs #7957 enhance search functionality and improve data filtering logic by:jorgep +- feat: refs #7957 open in new tab by:jorgep +- feat: refs #7957 simplify fn to by:jorgep +- feat: refs #7957 update VnSearchbar component with improved search URL handling and styling enhancements by:jorgep +- feat: refs #8117 filters and values added as needed by:jtubau +- feat: refs #8197 useHasContent and use in VnSection and RightMenu by:alexm +- feat: refs #8219 added invoice out e2e tests by:Jon +- feat: refs #8219 global invoicing e2e by:Jon +- feat: refs #8220 added barcodes e2e test by:Jon +- feat: refs #8220 created items e2e by:Jon +- feat: refs #8220 modified create item form and added respective e2e by:Jon +- feat: refs #8225 added account and invoiceOut modules by:Jon +- feat: refs #8225 added entry module and fixed translations by:Jon +- feat: refs #8225 added invoiceIn and travel module by:Jon +- feat: refs #8225 added moreOptions and use it in customer and ticket summary by:Jon +- feat: refs #8225 added route and shelving module by:Jon +- feat: refs #8225 added worker and zone modules by:Jon +- feat: refs #8225 use it in claim, item and order modules by:Jon +- feat: refs #8258 added button to pass to uppercase by:provira +- feat: refs #8258 added uppercase option to VnInput by:provira +- feat: refs #8258 added uppercase validation on supplier create by:provira +- feat: refs #8298 add price optimum input and update translations for bonus and price optimum by:jgallego +- feat: refs #8316 add entryFilter prop to VnTable component in EntryList by:jtubau +- feat: refs #8322 added department changes by:provira +- feat: refs #8372 workerPBX by:robert +- feat: refs #8381 add initial and final temperature fields to entry forms and summaries by:jgallego +- feat: refs #8381 add initial and final temperature labels in English and Spanish locales by:jgallego +- feat: refs #8381 add toCelsius filter and update temperature fields in entry forms and summaries by:jgallego +- feat: skip tests by:jorgep +- style: refs #7957 update VnSearchbar padding for improved layout by:jorgep ### Changed ๐ฆ -- perf: refs #8219 #8219 minor change by:Javier Segarra -- perf: refs #8220 on-fetch and added missing translations by:Jon -- perf: refs #8220 on-fetch by:Jon -- perf: refs #8220 translations by:Jon -- perf: refs #8220 use searchbar selector in e2e tests by:Jon -- perf: remove warning default value by:Javier Segarra -- refactor: redirect using params by:Jon -- refactor: refs #7077 removed some comments by:provira -- refactor: refs #7087 removed unused imports by:provira -- refactor: refs #7100 added const mockData by:jtubau -- refactor: refs #7100 delete unnecesary set prop by:jtubau -- refactor: refs #7100 refactorized with methods by:jtubau -- refactor: refs #7957 remove blank by:jorgep -- refactor: refs #8198 simplify data fetching and filtering logic by:jorgep -- refactor: refs #8198 simplify state management and data fetching in ItemDiary component by:jorgep -- refactor: refs #8219 modified e2e tests and fixed some translations by:Jon -- refactor: refs #8219 modified list test, created cypress download folder and added to gitignore by:Jon -- refactor: refs #8219 requested changes by:Jon -- refactor: refs #8219 use checkNotification command by:Jon -- refactor: refs #8220 added data-cy for e2e tests by:Jon -- refactor: refs #8220 requested changes by:Jon -- refactor: refs #8220 skip failling test and modifed tag test by:Jon -- refactor: refs #8225 requested changes by:Jon -- refactor: refs #8247 use new acl for sysadmin by:Jon -- refactor: refs #8316 added claimFilter by:jtubau -- refactor: refs #8316 added entryFilter by:jtubau -- refactor: refs #8316 add new localization keys and update existing ones for entry components by:jtubau -- refactor: refs #8316 moved localizations to local locale by:jtubau -- refactor: refs #8316 move order localization by:jtubau -- refactor: refs #8316 remove unused OrderSearchbar component by:jtubau -- refactor: refs #8316 update EntryCard to use user-filter prop and remove exprBuilder from EntryList by:jtubau -- refactor: refs #8316 used VnSection and VnCardBeta by:jtubau -- refactor: refs #8322 changed translations by:provira -- refactor: refs #8322 changed Worker component to use VnSection/VnCardBeta by:provira -- refactor: refs #8322 set department inside worker by:alexm -- refactor: skip intermitent failing test by:Jon +- perf: refs #8219 #8219 minor change by:Javier Segarra +- perf: refs #8220 on-fetch and added missing translations by:Jon +- perf: refs #8220 on-fetch by:Jon +- perf: refs #8220 translations by:Jon +- perf: refs #8220 use searchbar selector in e2e tests by:Jon +- perf: remove warning default value by:Javier Segarra +- refactor: redirect using params by:Jon +- refactor: refs #7077 removed some comments by:provira +- refactor: refs #7087 removed unused imports by:provira +- refactor: refs #7100 added const mockData by:jtubau +- refactor: refs #7100 delete unnecesary set prop by:jtubau +- refactor: refs #7100 refactorized with methods by:jtubau +- refactor: refs #7957 remove blank by:jorgep +- refactor: refs #8198 simplify data fetching and filtering logic by:jorgep +- refactor: refs #8198 simplify state management and data fetching in ItemDiary component by:jorgep +- refactor: refs #8219 modified e2e tests and fixed some translations by:Jon +- refactor: refs #8219 modified list test, created cypress download folder and added to gitignore by:Jon +- refactor: refs #8219 requested changes by:Jon +- refactor: refs #8219 use checkNotification command by:Jon +- refactor: refs #8220 added data-cy for e2e tests by:Jon +- refactor: refs #8220 requested changes by:Jon +- refactor: refs #8220 skip failling test and modifed tag test by:Jon +- refactor: refs #8225 requested changes by:Jon +- refactor: refs #8247 use new acl for sysadmin by:Jon +- refactor: refs #8316 added claimFilter by:jtubau +- refactor: refs #8316 added entryFilter by:jtubau +- refactor: refs #8316 add new localization keys and update existing ones for entry components by:jtubau +- refactor: refs #8316 moved localizations to local locale by:jtubau +- refactor: refs #8316 move order localization by:jtubau +- refactor: refs #8316 remove unused OrderSearchbar component by:jtubau +- refactor: refs #8316 update EntryCard to use user-filter prop and remove exprBuilder from EntryList by:jtubau +- refactor: refs #8316 used VnSection and VnCardBeta by:jtubau +- refactor: refs #8322 changed translations by:provira +- refactor: refs #8322 changed Worker component to use VnSection/VnCardBeta by:provira +- refactor: refs #8322 set department inside worker by:alexm +- refactor: skip intermitent failing test by:Jon ### Fixed ๐ ๏ธ -- feat: refs #8225 added entry module and fixed translations by:Jon -- fix: added missing translations in InvoiceIn by:provira -- fix: changed invoiceIn for InvoiceIn by:provira -- fix: changed translations to only use "invoicein" by:provira -- fix: department descriptor link by:Jon -- fix: e2e tests by:Jon -- fix: entry summary view and build warnings by:Jon -- fix: fixed InvoiceIn filter translations by:provira -- fix: modified setData in customerDescriptor to show the icons by:Jon -- fix: redirect to TicketSale from OrderLines (origin/Fix-RedirectToTicketSale) by:Jon -- fix: redirect when confirming lines by:Jon -- fix: refs #7055 #7055 #7055 fixed some tests by:provira -- fix: refs #7077 removed unused imports by:provira -- fix: refs #7078 added missing case with array by:provira -- fix: refs #7087 fixed some tests by:provira -- fix: refs #7088 changed "vm.vm" to "vm" by:provira -- fix: refs #7088 changed wrapper to vm by:provira -- fix: refs #7699 add icons and hint by:carlossa -- fix: refs #7699 add pwd vnInput by:carlossa -- fix: refs #7699 fix component by:carlossa -- fix: refs #7699 fix password visibility by:carlossa -- fix: refs #7699 fix tfront clean code by:carlossa -- fix: refs #7699 fix vnChangePassword, clean VnInput by:carlossa -- fix: refs #7699 fix vnInputPassword by:carlossa -- fix: refs #7957 add missing closing brace by:jorgep -- fix: refs #7957 css by:jorgep -- fix: refs #7957 rollback by:jorgep -- fix: refs #7957 update data-cy by:jorgep -- fix: refs #7957 update visibility handling for clear icon in VnInput component by:jorgep -- fix: refs #7957 vn-searchbar test by:jorgep -- fix: refs #8117 update salesPersonFk filter options and URL for improved data retrieval by:jtubau -- fix: refs #8197 not use yet by:alexm -- fix: refs #8198 update query param by:jorgep -- fix: refs #8219 fixed e2e tests by:Jon -- fix: refs #8219 fixed summary and global tests by:Jon -- fix: refs #8219 forgotten dataCy by:Jon -- fix: refs #8219 global e2e by:Jon -- fix: refs #8219 requested changes by:Jon -- fix: refs #8220 itemTag test by:Javier Segarra -- fix: refs #8225 invoice in translations by:Jon -- fix: refs #8243 fixed SkeletonSummary by:provira -- fix: refs #8247 conflicts by:Jon -- fix: refs #8247 fixed acls and added lost options by:Jon -- fix: refs #8316 ref="claimFilterRef" by:alexm -- fix: refs #8316 userFilter by:alexm -- fix: refs #8316 use rightMenu by:alexm -- fix: refs #8316 use section-searchbar by:alexm -- fix: refs #8317 disable action buttons when no rows are selected in ItemFixedPrice by:jtubau -- fix: refs #8322 unnecessary section by:alexm -- fix: refs #8338 fixed VnTable translations by:provira -- fix: refs #8338 removed chipLocale property/added more translations by:provira -- fix: refs #8448 e2e by:Jon -- fix: refs #8448 not use croppie by:alexm -- fix: remove departmentCode by:Javier Segarra -- fix: removed unused searchbar by:PAU ROVIRA ROSALENY -- fix: skip failling e2e by:Jon -- fix: sort by name in description by:Jon -- fix: translations by:Jon -- fix: use entryFilter by:alexm -- fix(VnCardBeta): add userFilter by:alexm -- refactor: refs #8219 modified e2e tests and fixed some translations by:Jon -- revert: revert header by:alexm -- test: fix expedition e2e by:alexm +- feat: refs #8225 added entry module and fixed translations by:Jon +- fix: added missing translations in InvoiceIn by:provira +- fix: changed invoiceIn for InvoiceIn by:provira +- fix: changed translations to only use "invoicein" by:provira +- fix: department descriptor link by:Jon +- fix: e2e tests by:Jon +- fix: entry summary view and build warnings by:Jon +- fix: fixed InvoiceIn filter translations by:provira +- fix: modified setData in customerDescriptor to show the icons by:Jon +- fix: redirect to TicketSale from OrderLines (origin/Fix-RedirectToTicketSale) by:Jon +- fix: redirect when confirming lines by:Jon +- fix: refs #7055 #7055 #7055 fixed some tests by:provira +- fix: refs #7077 removed unused imports by:provira +- fix: refs #7078 added missing case with array by:provira +- fix: refs #7087 fixed some tests by:provira +- fix: refs #7088 changed "vm.vm" to "vm" by:provira +- fix: refs #7088 changed wrapper to vm by:provira +- fix: refs #7699 add icons and hint by:carlossa +- fix: refs #7699 add pwd vnInput by:carlossa +- fix: refs #7699 fix component by:carlossa +- fix: refs #7699 fix password visibility by:carlossa +- fix: refs #7699 fix tfront clean code by:carlossa +- fix: refs #7699 fix vnChangePassword, clean VnInput by:carlossa +- fix: refs #7699 fix vnInputPassword by:carlossa +- fix: refs #7957 add missing closing brace by:jorgep +- fix: refs #7957 css by:jorgep +- fix: refs #7957 rollback by:jorgep +- fix: refs #7957 update data-cy by:jorgep +- fix: refs #7957 update visibility handling for clear icon in VnInput component by:jorgep +- fix: refs #7957 vn-searchbar test by:jorgep +- fix: refs #8117 update salesPersonFk filter options and URL for improved data retrieval by:jtubau +- fix: refs #8197 not use yet by:alexm +- fix: refs #8198 update query param by:jorgep +- fix: refs #8219 fixed e2e tests by:Jon +- fix: refs #8219 fixed summary and global tests by:Jon +- fix: refs #8219 forgotten dataCy by:Jon +- fix: refs #8219 global e2e by:Jon +- fix: refs #8219 requested changes by:Jon +- fix: refs #8220 itemTag test by:Javier Segarra +- fix: refs #8225 invoice in translations by:Jon +- fix: refs #8243 fixed SkeletonSummary by:provira +- fix: refs #8247 conflicts by:Jon +- fix: refs #8247 fixed acls and added lost options by:Jon +- fix: refs #8316 ref="claimFilterRef" by:alexm +- fix: refs #8316 userFilter by:alexm +- fix: refs #8316 use rightMenu by:alexm +- fix: refs #8316 use section-searchbar by:alexm +- fix: refs #8317 disable action buttons when no rows are selected in ItemFixedPrice by:jtubau +- fix: refs #8322 unnecessary section by:alexm +- fix: refs #8338 fixed VnTable translations by:provira +- fix: refs #8338 removed chipLocale property/added more translations by:provira +- fix: refs #8448 e2e by:Jon +- fix: refs #8448 not use croppie by:alexm +- fix: remove departmentCode by:Javier Segarra +- fix: removed unused searchbar by:PAU ROVIRA ROSALENY +- fix: skip failling e2e by:Jon +- fix: sort by name in description by:Jon +- fix: translations by:Jon +- fix: use entryFilter by:alexm +- fix(VnCardBeta): add userFilter by:alexm +- refactor: refs #8219 modified e2e tests and fixed some translations by:Jon +- revert: revert header by:alexm +- test: fix expedition e2e by:alexm # Version 25.00 - 2025-01-14 ### Added ๐ -- chore: refs #7056 move test by:jorgep -- feat: refs #7050 7050 add object check by:Jtubau -- feat: refs #7050 7050 add test to isEmpty() by:Jtubau -- feat: refs #7056 add tests in FormModel by:jorgep -- feat: refs #7056 update route meta information and add FormModel tests by:jorgep -- feat: refs #7074 tests for fns setData(), parseDms() and showFormDialog() (7074-makeFrontTestToVnDmsList) by:Jtubau -- feat: refs #7079 created VnLocation front test by:provira -- feat: refs #7189 add Accept-Language header to axios requests by:jorgep -- feat: refs #7924 add custom inspection checkbox and localization support by:jgallego -- feat: refs #7924 update custom inspection label for clarity in English and Spanish locales by:jgallego -- feat: refs #8004 enhance FetchedTags component with column support and styling updates by:pablone -- feat: refs #8004 hide rightFilter by:pablone -- feat: refs #8246 added new field in list by:Jon -- feat: refs #8266 added descriptor to item name by:jtubau -- feat: refs #8293 add zone filter by:Jtubau -- feat: refs #8293 include zone data in each record by:Jtubau -- fix: refs #8004 more list style issues by:pablone -- fix: refs #8004 some style issues on all list by:pablone -- style: refs #8004 update layout and styling in FetchedTags and ItemList components by:pablone -- style: update CustomerBalance.vue to set label color by:jgallego +- chore: refs #7056 move test by:jorgep +- feat: refs #7050 7050 add object check by:Jtubau +- feat: refs #7050 7050 add test to isEmpty() by:Jtubau +- feat: refs #7056 add tests in FormModel by:jorgep +- feat: refs #7056 update route meta information and add FormModel tests by:jorgep +- feat: refs #7074 tests for fns setData(), parseDms() and showFormDialog() (7074-makeFrontTestToVnDmsList) by:Jtubau +- feat: refs #7079 created VnLocation front test by:provira +- feat: refs #7189 add Accept-Language header to axios requests by:jorgep +- feat: refs #7924 add custom inspection checkbox and localization support by:jgallego +- feat: refs #7924 update custom inspection label for clarity in English and Spanish locales by:jgallego +- feat: refs #8004 enhance FetchedTags component with column support and styling updates by:pablone +- feat: refs #8004 hide rightFilter by:pablone +- feat: refs #8246 added new field in list by:Jon +- feat: refs #8266 added descriptor to item name by:jtubau +- feat: refs #8293 add zone filter by:Jtubau +- feat: refs #8293 include zone data in each record by:Jtubau +- fix: refs #8004 more list style issues by:pablone +- fix: refs #8004 some style issues on all list by:pablone +- style: refs #8004 update layout and styling in FetchedTags and ItemList components by:pablone +- style: update CustomerBalance.vue to set label color by:jgallego ### Changed ๐ฆ -- perf: order by:alexm -- perf: redirect transition list to card by:alexm -- perf: refs #8201 onDataSaved fetch by:Jon -- perf: revert processData by:alexm -- perf: simplify if by:alexm -- perf: simplify if (perf_redirectTransition) by:alexm -- refactor: item fixedPrice by:Jon -- refactor: refs #7050 refactorize by:jtubau -- refactor: refs #7050 removed blank spaces by:jtubau -- refactor: refs #7052 move EditTableCellValueForm tests to a new location and enhance test coverage by:jgallego -- refactor: refs #7052 remove unnecessary console logs from EditTableCellValueForm tests by:jgallego -- refactor: refs #7074 move dms constant to global scope by:Jtubau -- refactor: refs #7079 removed useless code by:provira -- refactor: refs #7924 simplify custom inspection icon rendering in ExtraCommunity.vue by:jgallego -- refactor: refs #8004 remove console log from CardSummary component on mount by:pablone -- refactor: refs #8004 remove consoleLogs by:pablone -- refactor: refs #8004 remove unused stateStore import in InvoiceInList.vue by:pablone -- refactor: refs #8004 remove unused travelFilterRef and chip definition in TravelList.vue by:pablone -- refactor: refs #8004 replace VnSelect with VnSelectWorker in CustomerList component by:pablone -- refactor: refs #8201 added onMounted to stablish the value to show icons by:Jon -- refactor: refs #8201 deleted condition by:Jon -- refactor: refs #8201 deleted log by:Jon -- refactor: refs #8201 deleted logs by:Jon -- refactor: refs #8266 8266 change expedition item name by:Jtubau -- refactor: refs #8266 change expedition label by:Jtubau -- refactor: refs #8293 remove redundant attributes by:Jtubau -- refactor: refs #8320 changed folder names from "specs" to "**tests**" by:provira -- refactor: refs #8320 moved front tests to their respective sections by:provira -- refactor: refs #8813 removed unused class property by:provira +- perf: order by:alexm +- perf: redirect transition list to card by:alexm +- perf: refs #8201 onDataSaved fetch by:Jon +- perf: revert processData by:alexm +- perf: simplify if by:alexm +- perf: simplify if (perf_redirectTransition) by:alexm +- refactor: item fixedPrice by:Jon +- refactor: refs #7050 refactorize by:jtubau +- refactor: refs #7050 removed blank spaces by:jtubau +- refactor: refs #7052 move EditTableCellValueForm tests to a new location and enhance test coverage by:jgallego +- refactor: refs #7052 remove unnecessary console logs from EditTableCellValueForm tests by:jgallego +- refactor: refs #7074 move dms constant to global scope by:Jtubau +- refactor: refs #7079 removed useless code by:provira +- refactor: refs #7924 simplify custom inspection icon rendering in ExtraCommunity.vue by:jgallego +- refactor: refs #8004 remove console log from CardSummary component on mount by:pablone +- refactor: refs #8004 remove consoleLogs by:pablone +- refactor: refs #8004 remove unused stateStore import in InvoiceInList.vue by:pablone +- refactor: refs #8004 remove unused travelFilterRef and chip definition in TravelList.vue by:pablone +- refactor: refs #8004 replace VnSelect with VnSelectWorker in CustomerList component by:pablone +- refactor: refs #8201 added onMounted to stablish the value to show icons by:Jon +- refactor: refs #8201 deleted condition by:Jon +- refactor: refs #8201 deleted log by:Jon +- refactor: refs #8201 deleted logs by:Jon +- refactor: refs #8266 8266 change expedition item name by:Jtubau +- refactor: refs #8266 change expedition label by:Jtubau +- refactor: refs #8293 remove redundant attributes by:Jtubau +- refactor: refs #8320 changed folder names from "specs" to "**tests**" by:provira +- refactor: refs #8320 moved front tests to their respective sections by:provira +- refactor: refs #8813 removed unused class property by:provira ### Fixed ๐ ๏ธ -- fix: discount class by:PAU ROVIRA ROSALENY -- fix: duplicate transalation after test to dev by:alexm -- fix: fix translations by:carlossa -- fix: redirect to sales when confirming lines by:Jon -- fix: refs #7050 delete import added by mistake by:Jtubau -- fix: refs #7133 handleSalesModelValue function to handle empty input by:jorgep -- fix: refs #7189 update user language on sessionStorage by:jorgep -- fix: refs #7935 remove unused 'companyFk' column from InvoiceInList component by:jorgep -- fix: refs #8004 more list style issues by:pablone -- fix: refs #8004 some style issues on all list by:pablone -- fix: refs #8004 update label for daysOnward in TravelFilter component and add translations by:pablone -- fix: refs #8004 vnTable card with and add permanent labels by:pablone -- fix: refs #8201 added onDataSaved emi to refetch when cahnges are made by:Jon -- fix: refs #8201 use arrayData to fix the error by:Jon -- fix: refs #8314 space between label and value by:jtubau -- fix: refs #8813 fixed ClaimLines format by:provira -- fix: update button sizes in ExtraCommunity.vue for better visibility by:jgallego -- perf: revert processData by:alexm -- refactor: item fixedPrice by:Jon +- fix: discount class by:PAU ROVIRA ROSALENY +- fix: duplicate transalation after test to dev by:alexm +- fix: fix translations by:carlossa +- fix: redirect to sales when confirming lines by:Jon +- fix: refs #7050 delete import added by mistake by:Jtubau +- fix: refs #7133 handleSalesModelValue function to handle empty input by:jorgep +- fix: refs #7189 update user language on sessionStorage by:jorgep +- fix: refs #7935 remove unused 'companyFk' column from InvoiceInList component by:jorgep +- fix: refs #8004 more list style issues by:pablone +- fix: refs #8004 some style issues on all list by:pablone +- fix: refs #8004 update label for daysOnward in TravelFilter component and add translations by:pablone +- fix: refs #8004 vnTable card with and add permanent labels by:pablone +- fix: refs #8201 added onDataSaved emi to refetch when cahnges are made by:Jon +- fix: refs #8201 use arrayData to fix the error by:Jon +- fix: refs #8314 space between label and value by:jtubau +- fix: refs #8813 fixed ClaimLines format by:provira +- fix: update button sizes in ExtraCommunity.vue for better visibility by:jgallego +- perf: revert processData by:alexm +- refactor: item fixedPrice by:Jon # Version 24.52 - 2024-01-07 ### Added ๐ -- chore: refs #8197 remove console log by:alexm -- chore: refs #8197 replace name by:alexm -- chore: refs #8197 unnecessary file by:alexm -- feat: #8110 apply mixin in quasar components by:Javier Segarra -- feat(Account & AccountRole): refs #8197 add VnCardMain by:alexm -- feat: addDptoLink by:Jtubau -- feat: added restore ticket function in ticket descriptor menu by:Jon -- feat: add support service wip by:jorgep -- feat: focus menu searchbar by:jorgep -- feat: make additional data object by:jorgep -- feat: message to grant access by:jorgep -- feat: refs #6583 add default param by:jorgep -- feat: refs #6583 add destination opt filter by:jorgep -- feat: refs #6583 add icon by:jorgep -- feat: refs #6583 add locale by:jorgep -- feat: refs #7072 added test to computed fn total by:Jtubau -- feat: refs #7235 update invoice out global form to fetch config based on serial type by:jgallego -- feat: refs #7301 add exclude inventory supplier from list by:pablone -- feat: refs #7301 enhance VnDateBadge styling and improve ItemLastEntries component by:pablone -- feat: refs #7882 Added distribution point by:guillermo -- feat: refs #7882 Added longitude & latitude by:guillermo -- feat: refs #7936 add autocomplete on tab fn by:jorgep -- feat: refs #7936 add company filter by:jorgep -- feat: refs #7936 add currency check before fetching by:jorgep -- feat: refs #7936 add dueDated field by:jorgep -- feat: refs #7936 add number validation to VnInputNumber & new daysAgo filter in InvoiceInFilter by:jorgep -- feat: refs #7936 add optionCaption by:jorgep -- feat: refs #7936 add row click navigation to InvoiceInSerial by:jorgep -- feat: refs #7936 add unit tests by:jorgep -- feat: refs #7936 add useAccountShortToStandard composable by:jorgep -- feat: refs #7936 calculate exchange & update taxable base by:jorgep -- feat: refs #7936 enhance downloadFile function to support opening in a new tab by:jorgep -- feat: refs #7936 enhance getTotal fn & add unit tests by:jorgep -- feat: refs #7936 enhance vn-select by:jorgep -- feat: refs #7936 improve optionLabel logic in InvoiceInVat component for better handling of numeric values by:jorgep -- feat: refs #7936 limit decimal places by:jorgep -- feat: refs #7936 make fields required by:jorgep -- feat: refs #7936 show country code & isVies fields by:jorgep -- feat: refs #7936 show id & value by:jorgep -- feat: refs #7936 simplify optionLabel wip by:jorgep -- feat: refs #7936 update 'isVies' label to use global translation key by:jorgep -- feat: refs #7936 update option labels in InvoiceIn components for better clarity by:jorgep -- feat: refs #7936 use default invoice data by:jorgep -- feat: refs #8001 change request by:robert -- feat: refs #8001 ticketExpeditionGrafana by:robert -- feat: refs #8194 created VnSelectWorker component and use it in Lilium by:Jon -- feat: refs #8197 better leftMenu and VnCardMain improvements by:alexm -- feat: refs #8197 default leftMenu by:alexm -- feat: refs #8197 default sectionName by:alexm -- feat: refs #8197 keepData in VnSection by:alexm -- feat: refs #8197 vnTableFilter by:alexm -- feat: refs #8197 working rightMenu by:alexm -- feat: remove re-fetch when add element by:Javier Segarra -- feat: remove search after category by:Javier Segarra -- feat: requested changes in item module by:Jon -- feat: update quantity by:Javier Segarra -- feat(VnPaginate): refs #8197 hold data when change to Card by:alexm +- chore: refs #8197 remove console log by:alexm +- chore: refs #8197 replace name by:alexm +- chore: refs #8197 unnecessary file by:alexm +- feat: #8110 apply mixin in quasar components by:Javier Segarra +- feat(Account & AccountRole): refs #8197 add VnCardMain by:alexm +- feat: addDptoLink by:Jtubau +- feat: added restore ticket function in ticket descriptor menu by:Jon +- feat: add support service wip by:jorgep +- feat: focus menu searchbar by:jorgep +- feat: make additional data object by:jorgep +- feat: message to grant access by:jorgep +- feat: refs #6583 add default param by:jorgep +- feat: refs #6583 add destination opt filter by:jorgep +- feat: refs #6583 add icon by:jorgep +- feat: refs #6583 add locale by:jorgep +- feat: refs #7072 added test to computed fn total by:Jtubau +- feat: refs #7235 update invoice out global form to fetch config based on serial type by:jgallego +- feat: refs #7301 add exclude inventory supplier from list by:pablone +- feat: refs #7301 enhance VnDateBadge styling and improve ItemLastEntries component by:pablone +- feat: refs #7882 Added distribution point by:guillermo +- feat: refs #7882 Added longitude & latitude by:guillermo +- feat: refs #7936 add autocomplete on tab fn by:jorgep +- feat: refs #7936 add company filter by:jorgep +- feat: refs #7936 add currency check before fetching by:jorgep +- feat: refs #7936 add dueDated field by:jorgep +- feat: refs #7936 add number validation to VnInputNumber & new daysAgo filter in InvoiceInFilter by:jorgep +- feat: refs #7936 add optionCaption by:jorgep +- feat: refs #7936 add row click navigation to InvoiceInSerial by:jorgep +- feat: refs #7936 add unit tests by:jorgep +- feat: refs #7936 add useAccountShortToStandard composable by:jorgep +- feat: refs #7936 calculate exchange & update taxable base by:jorgep +- feat: refs #7936 enhance downloadFile function to support opening in a new tab by:jorgep +- feat: refs #7936 enhance getTotal fn & add unit tests by:jorgep +- feat: refs #7936 enhance vn-select by:jorgep +- feat: refs #7936 improve optionLabel logic in InvoiceInVat component for better handling of numeric values by:jorgep +- feat: refs #7936 limit decimal places by:jorgep +- feat: refs #7936 make fields required by:jorgep +- feat: refs #7936 show country code & isVies fields by:jorgep +- feat: refs #7936 show id & value by:jorgep +- feat: refs #7936 simplify optionLabel wip by:jorgep +- feat: refs #7936 update 'isVies' label to use global translation key by:jorgep +- feat: refs #7936 update option labels in InvoiceIn components for better clarity by:jorgep +- feat: refs #7936 use default invoice data by:jorgep +- feat: refs #8001 change request by:robert +- feat: refs #8001 ticketExpeditionGrafana by:robert +- feat: refs #8194 created VnSelectWorker component and use it in Lilium by:Jon +- feat: refs #8197 better leftMenu and VnCardMain improvements by:alexm +- feat: refs #8197 default leftMenu by:alexm +- feat: refs #8197 default sectionName by:alexm +- feat: refs #8197 keepData in VnSection by:alexm +- feat: refs #8197 vnTableFilter by:alexm +- feat: refs #8197 working rightMenu by:alexm +- feat: remove re-fetch when add element by:Javier Segarra +- feat: remove search after category by:Javier Segarra +- feat: requested changes in item module by:Jon +- feat: update quantity by:Javier Segarra +- feat(VnPaginate): refs #8197 hold data when change to Card by:alexm ### Changed ๐ฆ -- perf: #6896 REMOVE COMMENTS by:Javier Segarra -- perf: qFormMixin by:Javier Segarra -- perf: qFormMixin improvement by:Javier Segarra -- perf: refs #8194 select worker component by:Jon -- perf: refs #8197 perf by:alexm -- perf: remove comments by:Javier Segarra -- perf: remove unused variables (origin/warmfix_noUsedVars) by:Javier Segarra -- refactor: added again search emit by:Jon -- refactor: add useCau composable by:jorgep -- refactor: deleted log by:Jon -- refactor: deleted onUnmounted code by:Jon -- refactor: deleted useless hidden tag by:Jon -- refactor: deleted warnings and corrected itemTag by:Jon -- refactor: drop logic by:jorgep -- refactor: ignore params when searching by id on searchbar (origin/VnSearchbar-SearchRemoveParams) by:Jon -- refactor: log error by:Jon -- refactor: refs #7936 locale by:jorgep -- refactor: refs #7936 simplify getTotal fn by:jorgep -- refactor: refs #7936 update label capitalization and replace invoice type options by:jorgep -- refactor: refs #8194 deleted unnecessary label by:Jon -- refactor: refs #8194 modified select worker template by:Jon -- refactor: refs #8194 modified select worker to allow no one filter from monitor ticket by:Jon -- refactor: refs #8194 moved translation to the correct place by:Jon -- refactor: refs #8194 requested changes by:Jon -- refactor: refs #8194 structure changes in component and related files by:Jon -- refactor: refs #8197 adapt AccountAcls to VnCardMain by:alexm -- refactor: refs #8197 adapt AccountAlias by:alexm -- refactor: refs #8197 adapt Ticket to VnCardMain by:alexm -- refactor: refs #8197 backward compatible (8197-VnCardMain_backwardCompatibility) by:alexm -- refactor: refs #8197 rename VnSectionMain to VnModule and VnCardMain to VnSection by:alexm -- refactor: refs #8288 changed invoice out spanish translation by:provira -- refactor: use locale keys by:jorgep -- refactor: use teleport to avoid qdrawer overlapping by:Jon -- refactor: use VnSelectWorker by:Jon +- perf: #6896 REMOVE COMMENTS by:Javier Segarra +- perf: qFormMixin by:Javier Segarra +- perf: qFormMixin improvement by:Javier Segarra +- perf: refs #8194 select worker component by:Jon +- perf: refs #8197 perf by:alexm +- perf: remove comments by:Javier Segarra +- perf: remove unused variables (origin/warmfix_noUsedVars) by:Javier Segarra +- refactor: added again search emit by:Jon +- refactor: add useCau composable by:jorgep +- refactor: deleted log by:Jon +- refactor: deleted onUnmounted code by:Jon +- refactor: deleted useless hidden tag by:Jon +- refactor: deleted warnings and corrected itemTag by:Jon +- refactor: drop logic by:jorgep +- refactor: ignore params when searching by id on searchbar (origin/VnSearchbar-SearchRemoveParams) by:Jon +- refactor: log error by:Jon +- refactor: refs #7936 locale by:jorgep +- refactor: refs #7936 simplify getTotal fn by:jorgep +- refactor: refs #7936 update label capitalization and replace invoice type options by:jorgep +- refactor: refs #8194 deleted unnecessary label by:Jon +- refactor: refs #8194 modified select worker template by:Jon +- refactor: refs #8194 modified select worker to allow no one filter from monitor ticket by:Jon +- refactor: refs #8194 moved translation to the correct place by:Jon +- refactor: refs #8194 requested changes by:Jon +- refactor: refs #8194 structure changes in component and related files by:Jon +- refactor: refs #8197 adapt AccountAcls to VnCardMain by:alexm +- refactor: refs #8197 adapt AccountAlias by:alexm +- refactor: refs #8197 adapt Ticket to VnCardMain by:alexm +- refactor: refs #8197 backward compatible (8197-VnCardMain_backwardCompatibility) by:alexm +- refactor: refs #8197 rename VnSectionMain to VnModule and VnCardMain to VnSection by:alexm +- refactor: refs #8288 changed invoice out spanish translation by:provira +- refactor: use locale keys by:jorgep +- refactor: use teleport to avoid qdrawer overlapping by:Jon +- refactor: use VnSelectWorker by:Jon ### Fixed ๐ ๏ธ -- fix: account by:carlossa -- fix: account create by:carlossa -- fix: accountList create by:carlossa -- fix(AccountList): use $refs by:alexm -- fix: add data-key by:alexm -- fix: addLocales by:Jtubau -- fix: dated field by:Jon -- fix: e2e by:jorgep -- fix: fix department filter by:carlossa -- fix: fixed translations by:Javier Segarra -- fix: fixed translations by:provira -- fix: get total from api by:Javier Segarra -- fix: handle non-object options by:jorgep -- fix: monitorPayMethodFilter by:carlossa -- fix: orderBy priority by:Javier Segarra -- fix: prevent null by:jorgep -- fix: redirection vnTable VnTableFilter by:alexm -- fix: refs #6389 fix filter trad by:carlossa -- fix: refs #6389 fix front, filters, itp by:carlossa -- fix: refs #6389 front add packing filter by:carlossa -- fix: refs #6389 front by:carlossa -- fix: refs #6389 front filters by:carlossa -- fix: refs #6389 ipt by:carlossa -- fix: refs #6389 packing by:carlossa -- fix: refs #6583 update checkbox for filtering by destination in TicketAdvanceFilter by:jorgep -- fix: refs #7031 add test e2e by:carlossa -- fix: refs #7031 fix zoneTest by:carlossa -- fix: refs #7301 unnecessary console logs from ItemLastEntries.vue by:pablone -- fix: refs #7936 changes by:jorgep -- fix: refs #7936 decimal places & locale by:jorgep -- fix: refs #7936 descriptor & dueday by:jorgep -- fix: refs #7936 exclude disabled els on tab by:jorgep -- fix: refs #7936 format tax calculation to two decimal places by:jorgep -- fix: refs #7936 improve error handling by:jorgep -- fix: refs #7936 redirection by:jorgep -- fix: refs #7936 rollback by:jorgep -- fix: refs #7936 serial by:jorgep -- fix: refs #7936 tabulation wip by:jorgep -- fix: refs #7936 test by:jorgep -- fix: refs #8114 clean by:carlossa -- fix: refs #8114 fix agencyList by:carlossa -- fix: refs #8114 fix lifeCycle hooks by:carlossa -- fix: refs #8114 fix pr by:carlossa -- fix: refs #8114 fix removeAddress by:carlossa -- fix: refs #8114 orderList by:carlossa -- fix: refs #8114 remove logs by:carlossa -- fix: refs #8197 mapKey (origin/8197-perf_vnTableInside, 8197-perf_vnTableInside) by:alexm -- fix: refs #8197 redirection (8197-perf_redirection) by:alexm -- fix: refs #8197 staticParams and redirect by:alexm -- fix: refs #8197 vnPaginate onFetch emit by:alexm -- fix: refs #8197 vnPaginate when change :id by:alexm -- fix: refs #8197 vnTableFilter in vnTable by:alexm -- fix: refs #8315 ticketBoxing test by:alexm -- fix: remove url by:carlossa -- fix: rollback by:jorgep -- fix: test by:jorgep -- fix(VnDmsList): refs #8197 add mapKey by:alexm -- revert: refs #8197 arrayData changes by:alexm -- test: refs #8197 fix e2e by:alexm -- test: refs #8315 fix claimDevelopment fixtures by:alexm -- test: refs #8315 fix clientList by:alexm -- test: refs #8315 fix VnSelect in e2e by:alexm +- fix: account by:carlossa +- fix: account create by:carlossa +- fix: accountList create by:carlossa +- fix(AccountList): use $refs by:alexm +- fix: add data-key by:alexm +- fix: addLocales by:Jtubau +- fix: dated field by:Jon +- fix: e2e by:jorgep +- fix: fix department filter by:carlossa +- fix: fixed translations by:Javier Segarra +- fix: fixed translations by:provira +- fix: get total from api by:Javier Segarra +- fix: handle non-object options by:jorgep +- fix: monitorPayMethodFilter by:carlossa +- fix: orderBy priority by:Javier Segarra +- fix: prevent null by:jorgep +- fix: redirection vnTable VnTableFilter by:alexm +- fix: refs #6389 fix filter trad by:carlossa +- fix: refs #6389 fix front, filters, itp by:carlossa +- fix: refs #6389 front add packing filter by:carlossa +- fix: refs #6389 front by:carlossa +- fix: refs #6389 front filters by:carlossa +- fix: refs #6389 ipt by:carlossa +- fix: refs #6389 packing by:carlossa +- fix: refs #6583 update checkbox for filtering by destination in TicketAdvanceFilter by:jorgep +- fix: refs #7031 add test e2e by:carlossa +- fix: refs #7031 fix zoneTest by:carlossa +- fix: refs #7301 unnecessary console logs from ItemLastEntries.vue by:pablone +- fix: refs #7936 changes by:jorgep +- fix: refs #7936 decimal places & locale by:jorgep +- fix: refs #7936 descriptor & dueday by:jorgep +- fix: refs #7936 exclude disabled els on tab by:jorgep +- fix: refs #7936 format tax calculation to two decimal places by:jorgep +- fix: refs #7936 improve error handling by:jorgep +- fix: refs #7936 redirection by:jorgep +- fix: refs #7936 rollback by:jorgep +- fix: refs #7936 serial by:jorgep +- fix: refs #7936 tabulation wip by:jorgep +- fix: refs #7936 test by:jorgep +- fix: refs #8114 clean by:carlossa +- fix: refs #8114 fix agencyList by:carlossa +- fix: refs #8114 fix lifeCycle hooks by:carlossa +- fix: refs #8114 fix pr by:carlossa +- fix: refs #8114 fix removeAddress by:carlossa +- fix: refs #8114 orderList by:carlossa +- fix: refs #8114 remove logs by:carlossa +- fix: refs #8197 mapKey (origin/8197-perf_vnTableInside, 8197-perf_vnTableInside) by:alexm +- fix: refs #8197 redirection (8197-perf_redirection) by:alexm +- fix: refs #8197 staticParams and redirect by:alexm +- fix: refs #8197 vnPaginate onFetch emit by:alexm +- fix: refs #8197 vnPaginate when change :id by:alexm +- fix: refs #8197 vnTableFilter in vnTable by:alexm +- fix: refs #8315 ticketBoxing test by:alexm +- fix: remove url by:carlossa +- fix: rollback by:jorgep +- fix: test by:jorgep +- fix(VnDmsList): refs #8197 add mapKey by:alexm +- revert: refs #8197 arrayData changes by:alexm +- test: refs #8197 fix e2e by:alexm +- test: refs #8315 fix claimDevelopment fixtures by:alexm +- test: refs #8315 fix clientList by:alexm +- test: refs #8315 fix VnSelect in e2e by:alexm # Version 24.50 - 2024-12-10 ### Added ๐ -- feat: add reportFileName option by:Javier Segarra -- feat: all clients just with global series by:jgallego -- feat: improve Merge branch 'test' into dev by:Javier Segarra -- feat: manual invoice in two lines by:jgallego -- feat: manualInvoice with address by:jgallego -- feat: randomize functions and example by:Javier Segarra -- feat: refs #6999 added search when user tabs on a filter with value by:Jon -- feat: refs #6999 added tab to search in VnTable filter by:Jon -- feat: refs #7346 #7346 improve form by:Javier Segarra -- feat: refs #7346 address ordered by:jgallego -- feat: refs #7346 radioButton by:jgallego -- feat: refs #7346 style radioButton by:jgallego -- feat: refs #7346 traducciones en cammelCase (7346-manualInvoice) by:jgallego -- feat: refs #8038 added new functionality in VnSelect and refactor styles by:Jon -- feat: refs #8061 #8061 updates by:Javier Segarra -- feat: refs #8087 reactive data by:jorgep -- feat: refs #8087 refs#8087 Redadas en travel by:Carlos Andrรฉs -- feat: refs #8138 add component ticket problems by:pablone -- feat: refs #8163 add max length and more tests by:wbuezas -- feat: refs #8163 add prop by:wbuezas -- feat: refs #8163 add VnInput insert functionality and e2e test by:wbuezas -- feat: refs #8163 limit with maxLength by:Javier Segarra -- feat: refs #8163 maxLength SupplierFD account by:Javier Segarra -- feat: refs #8163 maxLengthVnInput by:Javier Segarra -- feat: refs #8163 use VnAccountNumber in VnAccountNumber by:Javier Segarra -- feat: refs #8166 show notification by:jorgep +- feat: add reportFileName option by:Javier Segarra +- feat: all clients just with global series by:jgallego +- feat: improve Merge branch 'test' into dev by:Javier Segarra +- feat: manual invoice in two lines by:jgallego +- feat: manualInvoice with address by:jgallego +- feat: randomize functions and example by:Javier Segarra +- feat: refs #6999 added search when user tabs on a filter with value by:Jon +- feat: refs #6999 added tab to search in VnTable filter by:Jon +- feat: refs #7346 #7346 improve form by:Javier Segarra +- feat: refs #7346 address ordered by:jgallego +- feat: refs #7346 radioButton by:jgallego +- feat: refs #7346 style radioButton by:jgallego +- feat: refs #7346 traducciones en cammelCase (7346-manualInvoice) by:jgallego +- feat: refs #8038 added new functionality in VnSelect and refactor styles by:Jon +- feat: refs #8061 #8061 updates by:Javier Segarra +- feat: refs #8087 reactive data by:jorgep +- feat: refs #8087 refs#8087 Redadas en travel by:Carlos Andrรฉs +- feat: refs #8138 add component ticket problems by:pablone +- feat: refs #8163 add max length and more tests by:wbuezas +- feat: refs #8163 add prop by:wbuezas +- feat: refs #8163 add VnInput insert functionality and e2e test by:wbuezas +- feat: refs #8163 limit with maxLength by:Javier Segarra +- feat: refs #8163 maxLength SupplierFD account by:Javier Segarra +- feat: refs #8163 maxLengthVnInput by:Javier Segarra +- feat: refs #8163 use VnAccountNumber in VnAccountNumber by:Javier Segarra +- feat: refs #8166 show notification by:jorgep ### Changed ๐ฆ -- feat: refs #8038 added new functionality in VnSelect and refactor styles by:Jon -- perf: add dataCy by:Javier Segarra -- perf: refs #7346 #7346 Imrpove interface dialog by:Javier Segarra -- perf: refs #7346 #7346 use v-show instead v-if by:Javier Segarra -- perf: refs #8036 currentFilter by:alexm -- perf: refs #8061 filter autonomy by:Javier Segarra -- perf: refs #8061 solve conflicts and random posCode it by:Javier Segarra -- perf: refs #8061 use opts from VnSelect by:Javier Segarra -- perf: refs #8163 #8061 createNewPostCodeForm by:Javier Segarra -- perf: remove console by:Javier Segarra -- perf: remove timeout by:Javier Segarra -- perf: test command fillInForm by:Javier Segarra -- refactor: refs #8162 remove comment by:wbuezas -- refactor: remove unnecesary things by:wbuezas +- feat: refs #8038 added new functionality in VnSelect and refactor styles by:Jon +- perf: add dataCy by:Javier Segarra +- perf: refs #7346 #7346 Imrpove interface dialog by:Javier Segarra +- perf: refs #7346 #7346 use v-show instead v-if by:Javier Segarra +- perf: refs #8036 currentFilter by:alexm +- perf: refs #8061 filter autonomy by:Javier Segarra +- perf: refs #8061 solve conflicts and random posCode it by:Javier Segarra +- perf: refs #8061 use opts from VnSelect by:Javier Segarra +- perf: refs #8163 #8061 createNewPostCodeForm by:Javier Segarra +- perf: remove console by:Javier Segarra +- perf: remove timeout by:Javier Segarra +- perf: test command fillInForm by:Javier Segarra +- refactor: refs #8162 remove comment by:wbuezas +- refactor: remove unnecesary things by:wbuezas ### Fixed ๐ ๏ธ -- fix: #8016 fetching data by:Javier Segarra -- fix: icons by:jgallego -- fix: refs #7229 download file by:jorgep -- fix: refs #7229 remove catch by:jorgep -- fix: refs #7229 set url by:jorgep -- fix: refs #7229 test by:jorgep -- fix: refs #7229 url by:jorgep -- fix: refs #7229 url + test by:jorgep -- fix: refs #7304 7304 clean warning by:carlossa -- fix: refs #7304 fix list by:carlossa -- fix: refs #7304 fix warning by:carlossa -- fix: refs #7346 traslations by:jgallego -- fix: refs #7529 add save by:carlossa -- fix: refs #7529 fix e2e by:carlossa -- fix: refs #7529 fix front by:carlossa -- fix: refs #7529 fix scss by:carlossa -- fix: refs #7529 fix te2e by:carlossa -- fix: refs #7529 fix workerPit e2e by:carlossa -- fix: refs #7529 front by:carlossa -- fix: refs #8036 apply exprBuilder after save filters by:alexm -- fix: refs #8036 only add where when required by:alexm -- fix: refs #8038 solve conflicts by:Jon -- fix: refs #8061 improve code dependencies (origin/8061_improve_newCP) by:Javier Segarra -- fix: refs #8138 move component from ui folder by:pablone -- fix: refs #8138 sme minor issues by:pablone -- fix: refs #8163 #8061 createNewPostCodeForm by:Javier Segarra -- fix: refs #8163 minor problem when keypress by:Javier Segarra -- fix: refs #8166 show zone error by:jorgep -- fix: removed selectedClient by:jgallego -- refs #7529 fix workerPit by:carlossa -- revert: refs #8061 test #8061 updates by:Javier Segarra -- test: fix own test by:Javier Segarra -- test: refs #8162 #8162 fix TicketList spec by:Javier Segarra +- fix: #8016 fetching data by:Javier Segarra +- fix: icons by:jgallego +- fix: refs #7229 download file by:jorgep +- fix: refs #7229 remove catch by:jorgep +- fix: refs #7229 set url by:jorgep +- fix: refs #7229 test by:jorgep +- fix: refs #7229 url by:jorgep +- fix: refs #7229 url + test by:jorgep +- fix: refs #7304 7304 clean warning by:carlossa +- fix: refs #7304 fix list by:carlossa +- fix: refs #7304 fix warning by:carlossa +- fix: refs #7346 traslations by:jgallego +- fix: refs #7529 add save by:carlossa +- fix: refs #7529 fix e2e by:carlossa +- fix: refs #7529 fix front by:carlossa +- fix: refs #7529 fix scss by:carlossa +- fix: refs #7529 fix te2e by:carlossa +- fix: refs #7529 fix workerPit e2e by:carlossa +- fix: refs #7529 front by:carlossa +- fix: refs #8036 apply exprBuilder after save filters by:alexm +- fix: refs #8036 only add where when required by:alexm +- fix: refs #8038 solve conflicts by:Jon +- fix: refs #8061 improve code dependencies (origin/8061_improve_newCP) by:Javier Segarra +- fix: refs #8138 move component from ui folder by:pablone +- fix: refs #8138 sme minor issues by:pablone +- fix: refs #8163 #8061 createNewPostCodeForm by:Javier Segarra +- fix: refs #8163 minor problem when keypress by:Javier Segarra +- fix: refs #8166 show zone error by:jorgep +- fix: removed selectedClient by:jgallego +- refs #7529 fix workerPit by:carlossa +- revert: refs #8061 test #8061 updates by:Javier Segarra +- test: fix own test by:Javier Segarra +- test: refs #8162 #8162 fix TicketList spec by:Javier Segarra # Version 24.48 - 2024-11-25 ### Added ๐ -- chore: correct checkNotification (fix_customer_issues) by:alexm -- chore: perf (warmFix_order_equalSalix) by:alexm -- chore: refs #6818 add spaces by:jorgep -- chore: refs #6818 drop useless code & comment by:jorgep -- chore: refs #7273 sticky add btn & refactor by:jorgep -- chore: refs #7524 fix test by:jorgep -- chore: refs #8039 not required by:alexm -- chore: refs #8078 fiz tests by:jorgep -- chore: refs #8078 rollback ref by:jorgep -- chore: remove console.log (warmFix_invoiceOut_Global) by:alexm -- chore: typo (fix_itemType-redirection) by:alexm -- feat: #6943 use openURL quasar by:Javier Segarra -- feat: #7782 add cypress report by:Javier Segarra -- feat: #7782 cypress.config watchForFileChanges by:Javier Segarra -- feat: #7782 npm run resetDatabase by:Javier Segarra -- feat: #7782 waitUntil domContentLoad by:Javier Segarra -- feat: added composable to confirm orders by:Jon -- feat: add /reports in gitignore (warmFix_reports_in_gitignore) by:alexm -- feat: apply changes for customerModule by:Javier Segarra -- feat: disabled buttons by:Javier Segarra -- feat: move buttons to DescriptorMenu by:Javier Segarra -- feat: refs #6818 add icon by:jorgep -- feat: refs #6818 fetch url & default channel by:jorgep -- feat: refs #6818 saysimple integration by:jorgep -- feat: refs #6839 module searching (6839-addSearchMenu) by:jorgep -- feat: refs #6839 normalize search by:jorgep -- feat: refs #6919 sync entry data by:jorgep -- feat: refs #7006 itemType basic data new inputs by:guillermo -- feat: refs #7006 itemTypeLog added by:guillermo -- feat: refs #7193 modified parking to use the scope and corrected small errors by:Jon -- feat: refs #7206 added inactive label and corrected minor errors by:Jon -- feat: refs #7308 #7308 remove warnings related to useSession by:Javier Segarra -- feat: refs #7349 usa back con permisos by:jgallego -- feat: refs #7524 add front test by:jorgep -- feat: refs #7874 improve vn-notes ui by:jorgep -- feat: refs #7970 notify changes by:Jon -- feat(): refs #8039 canceledError not notify by:alexm -- feat: refs #8039 notify error unify by:alexm -- feat: refs #8039 show duplicate request in local by:alexm -- feat: refs #8078 add shortcut multi selection by:jorgep -- feat: refs #8078 add tests by:jorgep -- feat: refs#8087 Redadas en travel by:Carlos Andrรฉs -- feat: refs #8087 Traspasar redadas a travels by:Carlos Andrรฉs -- feat: remove comments by:Javier Segarra -- feat(Supplier): add companySize by:alexm -- feat: use composable to unify logic by:Javier Segarra -- feat(VnInput): empty to null by:alexm -- feat(VnSelect): order data equal salix by:alexm -- feat(VnSelect): refs #7136 add scroll (7136-vnSelect_paginate_simplify_2) by:alexm +- chore: correct checkNotification (fix_customer_issues) by:alexm +- chore: perf (warmFix_order_equalSalix) by:alexm +- chore: refs #6818 add spaces by:jorgep +- chore: refs #6818 drop useless code & comment by:jorgep +- chore: refs #7273 sticky add btn & refactor by:jorgep +- chore: refs #7524 fix test by:jorgep +- chore: refs #8039 not required by:alexm +- chore: refs #8078 fiz tests by:jorgep +- chore: refs #8078 rollback ref by:jorgep +- chore: remove console.log (warmFix_invoiceOut_Global) by:alexm +- chore: typo (fix_itemType-redirection) by:alexm +- feat: #6943 use openURL quasar by:Javier Segarra +- feat: #7782 add cypress report by:Javier Segarra +- feat: #7782 cypress.config watchForFileChanges by:Javier Segarra +- feat: #7782 npm run resetDatabase by:Javier Segarra +- feat: #7782 waitUntil domContentLoad by:Javier Segarra +- feat: added composable to confirm orders by:Jon +- feat: add /reports in gitignore (warmFix_reports_in_gitignore) by:alexm +- feat: apply changes for customerModule by:Javier Segarra +- feat: disabled buttons by:Javier Segarra +- feat: move buttons to DescriptorMenu by:Javier Segarra +- feat: refs #6818 add icon by:jorgep +- feat: refs #6818 fetch url & default channel by:jorgep +- feat: refs #6818 saysimple integration by:jorgep +- feat: refs #6839 module searching (6839-addSearchMenu) by:jorgep +- feat: refs #6839 normalize search by:jorgep +- feat: refs #6919 sync entry data by:jorgep +- feat: refs #7006 itemType basic data new inputs by:guillermo +- feat: refs #7006 itemTypeLog added by:guillermo +- feat: refs #7193 modified parking to use the scope and corrected small errors by:Jon +- feat: refs #7206 added inactive label and corrected minor errors by:Jon +- feat: refs #7308 #7308 remove warnings related to useSession by:Javier Segarra +- feat: refs #7349 usa back con permisos by:jgallego +- feat: refs #7524 add front test by:jorgep +- feat: refs #7874 improve vn-notes ui by:jorgep +- feat: refs #7970 notify changes by:Jon +- feat(): refs #8039 canceledError not notify by:alexm +- feat: refs #8039 notify error unify by:alexm +- feat: refs #8039 show duplicate request in local by:alexm +- feat: refs #8078 add shortcut multi selection by:jorgep +- feat: refs #8078 add tests by:jorgep +- feat: refs#8087 Redadas en travel by:Carlos Andrรฉs +- feat: refs #8087 Traspasar redadas a travels by:Carlos Andrรฉs +- feat: remove comments by:Javier Segarra +- feat(Supplier): add companySize by:alexm +- feat: use composable to unify logic by:Javier Segarra +- feat(VnInput): empty to null by:alexm +- feat(VnSelect): order data equal salix by:alexm +- feat(VnSelect): refs #7136 add scroll (7136-vnSelect_paginate_simplify_2) by:alexm ### Changed ๐ฆ -- chore: perf (warmFix_order_equalSalix) by:alexm -- chore: refs #7273 sticky add btn & refactor by:jorgep -- fix: better performance (warmFix_accountAcls) by:alexm -- perf: minor bugs detected by:Javier Segarra -- perf: refs #6943 #6943 merge command by:Javier Segarra -- perf: refs #7283 #7283 declare composable inst4ead code duplicated by:Javier Segarra -- perf: refs #7283 #7283 handle composable i18n by:Javier Segarra -- perf: refs #7283 #7283 handle i18n by:Javier Segarra -- perf: refs #7283 #7283 i18n params by:Javier Segarra -- perf: refs #7308 #7308 remove comments by:Javier Segarra -- perf: remove appendParams by:Javier Segarra -- perf: use const in VnLocation by:Javier Segarra -- perf: use required instead :required="true" by:Javier Segarra -- refactor: apply QPopupProxy by:wbuezas -- refactor: changed confirmOrder directory by:Jon -- refactor: change keyup.enter for update:model-value by:wbuezas -- refactor(InvoiceInBasicData): use VnDms by:alexm -- refactor: modified composable by:Jon -- refactor: refs #6818 change channel source by:jorgep -- refactor: refs #6818 channel logic by:jorgep -- refactor: refs #6919 export filter by:jorgep -- refactor: refs #7132 1st wave of changes in global translations files by:Jon -- refactor: refs #7132 account's module translations by:Jon -- refactor: refs #7132 customer's module translations by:Jon -- refactor: refs #7132 deleted pageTitles repeated by:Jon -- refactor: refs #7132 delete duplicate translations' keys by:Jon -- refactor: refs #7132 deleted useless code by:Jon -- refactor: refs #7132 global translations files changed by:Jon -- refactor: refs #7266 Changed method name by:guillermo -- refactor: refs #7950 Created cmr model by:guillermo -- refactor: refs #7970 added emit by:Jon -- refactor: refs #7970 refactored VnConfirm to emit events by:Jon -- refactor: refs #8185 modified LeftMenu to avoid duplicates by:Jon -- refactor: remove unused variable by:wbuezas -- refactor: revert catalog changes by:Jon -- refactor: small change by:wbuezas -- test: refactor e2e by:alexm -- test: refs #8039 add hasNotify and, refactor: agencyWorkCenter test by:alexm +- chore: perf (warmFix_order_equalSalix) by:alexm +- chore: refs #7273 sticky add btn & refactor by:jorgep +- fix: better performance (warmFix_accountAcls) by:alexm +- perf: minor bugs detected by:Javier Segarra +- perf: refs #6943 #6943 merge command by:Javier Segarra +- perf: refs #7283 #7283 declare composable inst4ead code duplicated by:Javier Segarra +- perf: refs #7283 #7283 handle composable i18n by:Javier Segarra +- perf: refs #7283 #7283 handle i18n by:Javier Segarra +- perf: refs #7283 #7283 i18n params by:Javier Segarra +- perf: refs #7308 #7308 remove comments by:Javier Segarra +- perf: remove appendParams by:Javier Segarra +- perf: use const in VnLocation by:Javier Segarra +- perf: use required instead :required="true" by:Javier Segarra +- refactor: apply QPopupProxy by:wbuezas +- refactor: changed confirmOrder directory by:Jon +- refactor: change keyup.enter for update:model-value by:wbuezas +- refactor(InvoiceInBasicData): use VnDms by:alexm +- refactor: modified composable by:Jon +- refactor: refs #6818 change channel source by:jorgep +- refactor: refs #6818 channel logic by:jorgep +- refactor: refs #6919 export filter by:jorgep +- refactor: refs #7132 1st wave of changes in global translations files by:Jon +- refactor: refs #7132 account's module translations by:Jon +- refactor: refs #7132 customer's module translations by:Jon +- refactor: refs #7132 deleted pageTitles repeated by:Jon +- refactor: refs #7132 delete duplicate translations' keys by:Jon +- refactor: refs #7132 deleted useless code by:Jon +- refactor: refs #7132 global translations files changed by:Jon +- refactor: refs #7266 Changed method name by:guillermo +- refactor: refs #7950 Created cmr model by:guillermo +- refactor: refs #7970 added emit by:Jon +- refactor: refs #7970 refactored VnConfirm to emit events by:Jon +- refactor: refs #8185 modified LeftMenu to avoid duplicates by:Jon +- refactor: remove unused variable by:wbuezas +- refactor: revert catalog changes by:Jon +- refactor: small change by:wbuezas +- test: refactor e2e by:alexm +- test: refs #8039 add hasNotify and, refactor: agencyWorkCenter test by:alexm ### Fixed ๐ ๏ธ -- chore: refs #7524 fix test by:jorgep -- fix: better performance (warmFix_accountAcls) by:alexm -- fix: catalog view category and type filter by:wbuezas -- fix: category and tags filters by:Jon -- fix: changed route.query by:Jon -- fix: change type vnput by:Javier Segarra -- fix(ClaimList): stateCode orderBy priority by:alexm -- fix: entryFilters by:carlossa -- fix: filter panel by:Jon -- fix(InvoiceOutGlobal): parallelism by:alexm -- fix: itemBotanical by:Javier Segarra -- fix: itemType redirection and fix filters by:alexm -- fix: logout spec (warmFix_logout.spec) by:alexm -- fix: merge errors by:alexm -- fix: order catalog by:wbuezas -- fix: order catalog fixes by:wbuezas -- fix: refs #6818 use right icon by:jorgep -- fix: refs #6896 fixed module problems by:Jon -- fix: refs #7193 fixed e2e test by:Jon -- fix: refs #7206 deleted duplicate code by:Jon -- fix: refs #7273 use same filter by:jorgep -- fix: refs #7283 #7283 bugs by:Javier Segarra -- fix: refs #7283 #7283 ItemDiary subToolbar by:Javier Segarra -- fix: refs #7283 #7283 ItemSummary bugs by:Javier Segarra -- fix: refs #7283 Account image resolution by:guillermo -- fix: refs #7283 css by:jorgep -- fix: refs #7283 filter by:carlossa -- fix: refs #7283 fix image by:carlossa -- fix: refs #7283 fix pr by:carlossa -- fix: refs #7283 fix preview by:carlossa -- fix: refs #7283 fix required by:carlossa -- fix: refs #7283 item filters by:carlossa -- fix: refs #7283 itemtype fix by:carlossa -- fix: refs #7283 order translation by:carlossa -- fix: refs #7283 preview by:carlossa -- fix: refs #7283 tooltips !Item by:Javier Segarra -- fix: refs #7306 clean warning by:carlossa -- fix: refs #7310 clean warning by:carlossa -- fix: refs #7323 locale #7396 by:jorgep -- fix: refs #7323 show advanced fields by:jorgep -- fix: refs #7349 dependencia no usada by:jgallego -- fix: refs #7524 e2e & worker module by:jorgep -- fix: refs #7874 add title by:jorgep -- fix: refs #7874 show name by:jorgep -- fix: refs #7943 use correct data-key by:jorgep -- fix: refs #7943 use summary by:jorgep -- fix: refs #8039 bad tests by:alexm -- fix: refs #8039 o not handle unnecessary errors by:alexm -- fix: refs #8078 e2e #7970 by:jorgep -- fix: refs #8078 handleSelection by:jorgep -- fix: refs #8078 improve cy command (8078-enableMultiSelection) by:jorgep -- fix: refs #8078 improve handleSelection by:jorgep -- fix: reset category by:wbuezas -- fix: tag chips by:Jon -- fix: vnSearchbar spec (warmFix_vnSearchBar.spec) by:alexm -- fix(VnSelect): setOptions when applyFilter by:alexm -- fix: worker test e2e by:Jon -- Merge branch 'dev' into fix_customer_issues by:Javier Segarra -- refactor: revert catalog changes by:Jon -- refs #7283 fix conflicts by:carlossa -- refs #7283 fix descriptorproxy by:carlossa -- refs #7283 fixedPrice by:carlossa -- refs #7283 fixedPrices by:carlossa -- refs #7283 fix itemFixed by:carlossa -- refs #7283 fix itemFixedPrice by:carlossa -- refs #7283 fix itemMigration by:carlossa -- refs #7283 fix itemMigration list filters by:carlossa -- refs #7283 fix items by:carlossa -- refs #7283 fix items error get images by:carlossa -- refs #7283 fix items images by:carlossa -- refs #7283 fix request by:carlossa -- refs #7283 fix searchbar by:carlossa -- refs #7283 fix viewSummary by:carlossa -- refs #7283 fix yml list basicData by:carlossa -- refs #7283 itemRequest fix by:carlossa -- refs #7283 itemRequest fix deny by:carlossa -- refs #7283 itemRequest fix reload by:carlossa -- refs #72983 fix filters by:carlossa -- revert: commit by:Javier Segarra -- revert e57a253c6f649382da187d1129449d265fb26d3b by:Javier Segarra -- test: #8162 fix clientList spec by:Javier Segarra -- test: #8162 fix vnLocation spec by:Javier Segarra -- test: fix arrayData by:Javier Segarra -- test: fix e2e by:alexm -- test: fix e2e by:Javier Segarra -- test: refs #8039 fix WorkerNotification e2e by:alexm -- test: refs #8039 fix ZoneWarehouse e2e by:alexm -- warmfix: ItemLastEntries to date (origin/warmfix_itemLastEntriesFilter) by:Javier Segarra +- chore: refs #7524 fix test by:jorgep +- fix: better performance (warmFix_accountAcls) by:alexm +- fix: catalog view category and type filter by:wbuezas +- fix: category and tags filters by:Jon +- fix: changed route.query by:Jon +- fix: change type vnput by:Javier Segarra +- fix(ClaimList): stateCode orderBy priority by:alexm +- fix: entryFilters by:carlossa +- fix: filter panel by:Jon +- fix(InvoiceOutGlobal): parallelism by:alexm +- fix: itemBotanical by:Javier Segarra +- fix: itemType redirection and fix filters by:alexm +- fix: logout spec (warmFix_logout.spec) by:alexm +- fix: merge errors by:alexm +- fix: order catalog by:wbuezas +- fix: order catalog fixes by:wbuezas +- fix: refs #6818 use right icon by:jorgep +- fix: refs #6896 fixed module problems by:Jon +- fix: refs #7193 fixed e2e test by:Jon +- fix: refs #7206 deleted duplicate code by:Jon +- fix: refs #7273 use same filter by:jorgep +- fix: refs #7283 #7283 bugs by:Javier Segarra +- fix: refs #7283 #7283 ItemDiary subToolbar by:Javier Segarra +- fix: refs #7283 #7283 ItemSummary bugs by:Javier Segarra +- fix: refs #7283 Account image resolution by:guillermo +- fix: refs #7283 css by:jorgep +- fix: refs #7283 filter by:carlossa +- fix: refs #7283 fix image by:carlossa +- fix: refs #7283 fix pr by:carlossa +- fix: refs #7283 fix preview by:carlossa +- fix: refs #7283 fix required by:carlossa +- fix: refs #7283 item filters by:carlossa +- fix: refs #7283 itemtype fix by:carlossa +- fix: refs #7283 order translation by:carlossa +- fix: refs #7283 preview by:carlossa +- fix: refs #7283 tooltips !Item by:Javier Segarra +- fix: refs #7306 clean warning by:carlossa +- fix: refs #7310 clean warning by:carlossa +- fix: refs #7323 locale #7396 by:jorgep +- fix: refs #7323 show advanced fields by:jorgep +- fix: refs #7349 dependencia no usada by:jgallego +- fix: refs #7524 e2e & worker module by:jorgep +- fix: refs #7874 add title by:jorgep +- fix: refs #7874 show name by:jorgep +- fix: refs #7943 use correct data-key by:jorgep +- fix: refs #7943 use summary by:jorgep +- fix: refs #8039 bad tests by:alexm +- fix: refs #8039 o not handle unnecessary errors by:alexm +- fix: refs #8078 e2e #7970 by:jorgep +- fix: refs #8078 handleSelection by:jorgep +- fix: refs #8078 improve cy command (8078-enableMultiSelection) by:jorgep +- fix: refs #8078 improve handleSelection by:jorgep +- fix: reset category by:wbuezas +- fix: tag chips by:Jon +- fix: vnSearchbar spec (warmFix_vnSearchBar.spec) by:alexm +- fix(VnSelect): setOptions when applyFilter by:alexm +- fix: worker test e2e by:Jon +- Merge branch 'dev' into fix_customer_issues by:Javier Segarra +- refactor: revert catalog changes by:Jon +- refs #7283 fix conflicts by:carlossa +- refs #7283 fix descriptorproxy by:carlossa +- refs #7283 fixedPrice by:carlossa +- refs #7283 fixedPrices by:carlossa +- refs #7283 fix itemFixed by:carlossa +- refs #7283 fix itemFixedPrice by:carlossa +- refs #7283 fix itemMigration by:carlossa +- refs #7283 fix itemMigration list filters by:carlossa +- refs #7283 fix items by:carlossa +- refs #7283 fix items error get images by:carlossa +- refs #7283 fix items images by:carlossa +- refs #7283 fix request by:carlossa +- refs #7283 fix searchbar by:carlossa +- refs #7283 fix viewSummary by:carlossa +- refs #7283 fix yml list basicData by:carlossa +- refs #7283 itemRequest fix by:carlossa +- refs #7283 itemRequest fix deny by:carlossa +- refs #7283 itemRequest fix reload by:carlossa +- refs #72983 fix filters by:carlossa +- revert: commit by:Javier Segarra +- revert e57a253c6f649382da187d1129449d265fb26d3b by:Javier Segarra +- test: #8162 fix clientList spec by:Javier Segarra +- test: #8162 fix vnLocation spec by:Javier Segarra +- test: fix arrayData by:Javier Segarra +- test: fix e2e by:alexm +- test: fix e2e by:Javier Segarra +- test: refs #8039 fix WorkerNotification e2e by:alexm +- test: refs #8039 fix ZoneWarehouse e2e by:alexm +- warmfix: ItemLastEntries to date (origin/warmfix_itemLastEntriesFilter) by:Javier Segarra # Version 24.40 - 2024-10-02 ### Added ๐ -- chore: refs #4074 admit several acls by:jorgep -- chore: refs #4074 drop workerCreate by:jorgep -- chore: refs #4074 fix tests by:jorgep -- chore: refs #4074 wip replace useRole for useAcl by:jorgep -- chore: refs #7155 remove console.log by:alexm -- chore: refs #7155 typo by:alexm -- chore: refs #7663 add test by:jorgep -- chore: refs #7663 create test wip by:jorgep -- chore: refs #7663 drop useless code (origin/7663-setWeight) by:jorgep -- chore: refs #7828 fix e2e by:jorgep -- feat(AccountBasicData): add twoFactorFk by:alexm -- feat: add max rule by:Javier Segarra -- feat: add shortcut add event in some subSections by:Javier Segarra -- feat: add shortcut more buttons (origin/add_shortcut_add_subSections) by:Javier Segarra -- feat: add tooltip CustomerNewCustomAgent by:Javier Segarra -- feat: apply color when today by:Javier Segarra -- feat: change label because its more natural by:Javier Segarra -- feat: change order by:Javier Segarra -- feat: change QBadge color by:Javier Segarra -- feat: change url CustomerList by:Javier Segarra -- feat: copy customer countryFk by:Javier Segarra -- feat: create VnSelectEnum and add in AccountBasicData and ClaimBasicData by:alexm -- feat: CustomerBalance by:Javier Segarra -- feat: CustomerConsumptionFilter by:Javier Segarra -- feat: customer consumption (origin/7830-customerDesplegables, 7830-customerDesplegables) by:alexm -- feat: CustomerCreateTicket by:Javier Segarra -- feat: CustomerCredit section by:Javier Segarra -- feat: CustomerGreuges by:Javier Segarra -- feat: CustomerSample to VnTable by:Javier Segarra -- feat: global handler (origin/fix_global_handler, fix_global_handler) by:alexm -- feat: goToSupplier by:Javier Segarra -- feat: handle newValue by:Javier Segarra -- feat: handle same multiple CP by:Javier Segarra -- feat: hide menus on small view (origin/hideMenu) by:jorgep -- feat: minor changes by:Javier Segarra -- feat: orderCreateDialog by:Javier Segarra -- feat: refs #4074 drop useless code by:jorgep -- feat: refs #4074 useAcl in vnSelectDialog by:jorgep -- feat: refs #6346 new wagon type section by:Jon -- feat: refs #7404 add m3 and fix detail by:pablone -- feat: refs #7404 add some style to the form and reorganize fields by:pablone -- feat: refs #7404 add travel m3 to reserves form by:pablone -- feat: refs #7404 style dynamic text color by:pablone -- feat: refs #7404 travel m3 form by:pablone -- feat: refs #7500 added VnImg to show files by:Jon -- feat: refs #7663 add setWeight menu opt (wip) by:jorgep -- feat: refs #7663 fine tunning by:jorgep -- feat: refs #7828 create axios instance which no manage errors (origin/7828-makeCorrectCalls) by:jorgep -- feat: refs #7828 useAcl & cherry pick mail data worker by:jorgep -- feat: remove cli warnings by:Javier Segarra -- feat: show preparation field by:Javier Segarra -- feat: stateGroupedFilter by:Javier Segarra -- feat: translations fixed by:jgallego -- feat(TravelList): add daysOnward by:alexm -- feat: travel m3 by:pablone -- feat: use disableInifiniteScroll property by:Javier Segarra -- feat: VnImg draggable by:Javier Segarra -- feat: vnLocation changes by:Javier Segarra -- feat: vnSelect exprBuilder by:Javier Segarra -- fix: refs #7404 remove some style by:pablone -- fix: refs #7404 style non center pop up (origin/7404-fixFront) by:pablone -- fix: refs #7404 translates and some minor style fixes by:pablone -- fix: styles by:Javier Segarra -- perf: improve style by:Javier Segarra +- chore: refs #4074 admit several acls by:jorgep +- chore: refs #4074 drop workerCreate by:jorgep +- chore: refs #4074 fix tests by:jorgep +- chore: refs #4074 wip replace useRole for useAcl by:jorgep +- chore: refs #7155 remove console.log by:alexm +- chore: refs #7155 typo by:alexm +- chore: refs #7663 add test by:jorgep +- chore: refs #7663 create test wip by:jorgep +- chore: refs #7663 drop useless code (origin/7663-setWeight) by:jorgep +- chore: refs #7828 fix e2e by:jorgep +- feat(AccountBasicData): add twoFactorFk by:alexm +- feat: add max rule by:Javier Segarra +- feat: add shortcut add event in some subSections by:Javier Segarra +- feat: add shortcut more buttons (origin/add_shortcut_add_subSections) by:Javier Segarra +- feat: add tooltip CustomerNewCustomAgent by:Javier Segarra +- feat: apply color when today by:Javier Segarra +- feat: change label because its more natural by:Javier Segarra +- feat: change order by:Javier Segarra +- feat: change QBadge color by:Javier Segarra +- feat: change url CustomerList by:Javier Segarra +- feat: copy customer countryFk by:Javier Segarra +- feat: create VnSelectEnum and add in AccountBasicData and ClaimBasicData by:alexm +- feat: CustomerBalance by:Javier Segarra +- feat: CustomerConsumptionFilter by:Javier Segarra +- feat: customer consumption (origin/7830-customerDesplegables, 7830-customerDesplegables) by:alexm +- feat: CustomerCreateTicket by:Javier Segarra +- feat: CustomerCredit section by:Javier Segarra +- feat: CustomerGreuges by:Javier Segarra +- feat: CustomerSample to VnTable by:Javier Segarra +- feat: global handler (origin/fix_global_handler, fix_global_handler) by:alexm +- feat: goToSupplier by:Javier Segarra +- feat: handle newValue by:Javier Segarra +- feat: handle same multiple CP by:Javier Segarra +- feat: hide menus on small view (origin/hideMenu) by:jorgep +- feat: minor changes by:Javier Segarra +- feat: orderCreateDialog by:Javier Segarra +- feat: refs #4074 drop useless code by:jorgep +- feat: refs #4074 useAcl in vnSelectDialog by:jorgep +- feat: refs #6346 new wagon type section by:Jon +- feat: refs #7404 add m3 and fix detail by:pablone +- feat: refs #7404 add some style to the form and reorganize fields by:pablone +- feat: refs #7404 add travel m3 to reserves form by:pablone +- feat: refs #7404 style dynamic text color by:pablone +- feat: refs #7404 travel m3 form by:pablone +- feat: refs #7500 added VnImg to show files by:Jon +- feat: refs #7663 add setWeight menu opt (wip) by:jorgep +- feat: refs #7663 fine tunning by:jorgep +- feat: refs #7828 create axios instance which no manage errors (origin/7828-makeCorrectCalls) by:jorgep +- feat: refs #7828 useAcl & cherry pick mail data worker by:jorgep +- feat: remove cli warnings by:Javier Segarra +- feat: show preparation field by:Javier Segarra +- feat: stateGroupedFilter by:Javier Segarra +- feat: translations fixed by:jgallego +- feat(TravelList): add daysOnward by:alexm +- feat: travel m3 by:pablone +- feat: use disableInifiniteScroll property by:Javier Segarra +- feat: VnImg draggable by:Javier Segarra +- feat: vnLocation changes by:Javier Segarra +- feat: vnSelect exprBuilder by:Javier Segarra +- fix: refs #7404 remove some style by:pablone +- fix: refs #7404 style non center pop up (origin/7404-fixFront) by:pablone +- fix: refs #7404 translates and some minor style fixes by:pablone +- fix: styles by:Javier Segarra +- perf: improve style by:Javier Segarra ### Changed ๐ฆ -- perf: CustomerBalance by:Javier Segarra -- perf: CustomerBasicData by:Javier Segarra -- perf: CustomerBasicData.salesPersonFk by:Javier Segarra -- perf: CustomerSummary by:Javier Segarra -- perf: customerSummaryTable by:Javier Segarra -- perf: disable card option by:Javier Segarra -- perf: i18n by:Javier Segarra -- perf: improve by:Javier Segarra -- perf: improve style by:Javier Segarra -- perf: imrpove exprBuilder by:Javier Segarra -- perf: minor comments by:Javier Segarra -- perf: refs #6346 previous changes by:Jon -- perf: sendEmail customerConsumption by:Javier Segarra -- perf: solve reload CardSummary component by:Javier Segarra -- perf: update CustommerDescriptor by:Javier Segarra -- refactor: refs #4074 accept array by:jorgep -- refactor: refs #4074 rollback by:jorgep -- refactor: refs #4074 use acl & drop useless roles by:jorgep -- refactor: refs #4074 useAcl in navigationStore & router by:jorgep -- refactor: refs #4074 use fn (origin/4074-useAcls) by:jorgep -- refactor: refs #4074 use VnTitle by:jorgep -- refactor: refs #6346 deleted front error checking by:Jon -- refactor: refs #6346 requested changes by:Jon -- refactor: refs #6346 wagons to VnTable by:Jon -- refactor: refs #7500 deleted useless code by:Jon -- refactor: refs #7500 refactor vnimg when storage is dms by:Jon -- refactor: refs #7828 wip by:jorgep +- perf: CustomerBalance by:Javier Segarra +- perf: CustomerBasicData by:Javier Segarra +- perf: CustomerBasicData.salesPersonFk by:Javier Segarra +- perf: CustomerSummary by:Javier Segarra +- perf: customerSummaryTable by:Javier Segarra +- perf: disable card option by:Javier Segarra +- perf: i18n by:Javier Segarra +- perf: improve by:Javier Segarra +- perf: improve style by:Javier Segarra +- perf: imrpove exprBuilder by:Javier Segarra +- perf: minor comments by:Javier Segarra +- perf: refs #6346 previous changes by:Jon +- perf: sendEmail customerConsumption by:Javier Segarra +- perf: solve reload CardSummary component by:Javier Segarra +- perf: update CustommerDescriptor by:Javier Segarra +- refactor: refs #4074 accept array by:jorgep +- refactor: refs #4074 rollback by:jorgep +- refactor: refs #4074 use acl & drop useless roles by:jorgep +- refactor: refs #4074 useAcl in navigationStore & router by:jorgep +- refactor: refs #4074 use fn (origin/4074-useAcls) by:jorgep +- refactor: refs #4074 use VnTitle by:jorgep +- refactor: refs #6346 deleted front error checking by:Jon +- refactor: refs #6346 requested changes by:Jon +- refactor: refs #6346 wagons to VnTable by:Jon +- refactor: refs #7500 deleted useless code by:Jon +- refactor: refs #7500 refactor vnimg when storage is dms by:Jon +- refactor: refs #7828 wip by:jorgep ### Fixed ๐ ๏ธ -- chore: refs #4074 fix tests by:jorgep -- chore: refs #7828 fix e2e by:jorgep -- feat: refs #7404 add m3 and fix detail by:pablone -- feat: translations fixed by:jgallego -- fix: #5938 grouped filter by:Javier Segarra -- fix: #6943 fix customerSummaryTable by:Javier Segarra -- fix: #6943 show nickname salesPerson by:Javier Segarra -- fix: address-create i18n by:Javier Segarra -- fix: comments (origin/6943_fix_customer_module, 6943_fix_customer_module) by:Javier Segarra -- fix: CusomerSummary to Address by:Javier Segarra -- fix: CustomerAddress mobile by:Javier Segarra -- fix: CustomerBillingData by:Javier Segarra -- fix: Customerconsumption by:Javier Segarra -- fix: customer credit opinion by:alexm -- fix: CustomerCreditOpinion workerDescriptor by:Javier Segarra -- fix: CustomerDescriptorAccount by:Javier Segarra -- fix: CustomerDescriptor.bussinessTypeFk by:Javier Segarra -- fix: CustomerFilter by:Javier Segarra -- fix: CustomerGreuges by:Javier Segarra -- fix: CustomerMandates by:Javier Segarra -- fix: Customer module find salesPersons out of first get by:Javier Segarra -- fix: CustomerRecovery transalate label by:Javier Segarra -- fix: CustomerSamples by:Javier Segarra -- fix: customerSummaryToTicketList button by:Javier Segarra -- fix: CustomerWebPayment by:Javier Segarra -- fix: CustommerSummaryTable Proxy by:Javier Segarra -- fix: deleted code by:Jon -- fix: duplicate code by:alexm -- fix: emit:updateModelValue by:Javier Segarra -- fix: fixed wagon tests by:Jon -- fix: fix wagon list reload by:Jon -- fix: i18n en preparation label by:Javier Segarra -- fix: infiniteScroll by:Javier Segarra -- fix: isFullMovable checkbox by:Javier Segarra -- fix: merge conflicts by:Javier Segarra -- fix: merge in dev by:alexm -- fix: missing code by:Jon -- fix: Options VnSelect properties by:Javier Segarra -- fix: refs #4074 await to watch by:jorgep -- fix: refs #4074 drop wrong acl by:jorgep -- fix: refs #4074 workerCard data-key by:jorgep -- fix: refs #6346 fix list and create by:pablone -- fix: refs #6943 prevent null (origin/6943-warmfix-preventNull) by:jorgep -- fix: refs #7155 remove userParams in watcher (7155-travel_daysOnward) by:alexm -- fix: refs #7155 use chip-locale (origin/7155-travel_daysOnward_2, 7155-travel_daysOnward_2) by:alexm -- fix: refs #7404 remove console.log by:pablone -- fix: refs #7404 remove from test by:pablone -- fix: refs #7404 remove some style by:pablone -- fix: refs #7404 revert commit prevent production access by:pablone -- fix: refs #7404 style non center pop up (origin/7404-fixFront) by:pablone -- fix: refs #7404 translates and some minor style fixes by:pablone -- fix: refs #7500 fixed e2e test by:Jon -- fix: refs #7500 fixed showing images wrongly by:Jon -- fix: refs #7830 customer credit by:pablone -- fix: refs #7830 remove console.log by:pablone -- fix: remove console.log by:pablone -- fix: remove FetchData by:Javier Segarra -- fix: remove FIXME (origin/6943_fix_customerSummaryTable) by:Javier Segarra -- fix: remove print variable by:Javier Segarra -- fix: remove promise execution by:Javier Segarra -- fix: reset VnTable scroll properties by:Javier Segarra -- fix: rule by:Javier Segarra -- fix: solve conflicts from master to test by:Javier Segarra -- fix: split params (origin/warmfix-addSearchUrl) by:jorgep -- fix: state cell by:Javier Segarra -- fix: stop call back event hasMoreData by:Javier Segarra -- fix: styles by:Javier Segarra -- fix: SupplierFiscalData VnLocation (origin/fix_supplierFD_location) by:Javier Segarra -- fix: VnLocation test by:Javier Segarra -- fix(VnTable): header background-color by:alexm -- fix(VnTable): sanitizer value is defined by:carlossa -- fix: wagon reload (origin/FixWagonRedirect) by:Jon -- fix: workerDms filter workerFk by:alexm -- fix(WorkerList): add type email by:alexm -- Merge remote-tracking branch 'origin/7830-customerDesplegables' into 6943_fix_customerSummaryTable by:Javier Segarra -- refs #7155 scopeDays fix (origin/7155-scopeDays) by:carlossa -- revert: vnUSerLink change by:Javier Segarra -- test: fix test (7677_vnLocation_perf) by:Javier Segarra +- chore: refs #4074 fix tests by:jorgep +- chore: refs #7828 fix e2e by:jorgep +- feat: refs #7404 add m3 and fix detail by:pablone +- feat: translations fixed by:jgallego +- fix: #5938 grouped filter by:Javier Segarra +- fix: #6943 fix customerSummaryTable by:Javier Segarra +- fix: #6943 show nickname salesPerson by:Javier Segarra +- fix: address-create i18n by:Javier Segarra +- fix: comments (origin/6943_fix_customer_module, 6943_fix_customer_module) by:Javier Segarra +- fix: CusomerSummary to Address by:Javier Segarra +- fix: CustomerAddress mobile by:Javier Segarra +- fix: CustomerBillingData by:Javier Segarra +- fix: Customerconsumption by:Javier Segarra +- fix: customer credit opinion by:alexm +- fix: CustomerCreditOpinion workerDescriptor by:Javier Segarra +- fix: CustomerDescriptorAccount by:Javier Segarra +- fix: CustomerDescriptor.bussinessTypeFk by:Javier Segarra +- fix: CustomerFilter by:Javier Segarra +- fix: CustomerGreuges by:Javier Segarra +- fix: CustomerMandates by:Javier Segarra +- fix: Customer module find salesPersons out of first get by:Javier Segarra +- fix: CustomerRecovery transalate label by:Javier Segarra +- fix: CustomerSamples by:Javier Segarra +- fix: customerSummaryToTicketList button by:Javier Segarra +- fix: CustomerWebPayment by:Javier Segarra +- fix: CustommerSummaryTable Proxy by:Javier Segarra +- fix: deleted code by:Jon +- fix: duplicate code by:alexm +- fix: emit:updateModelValue by:Javier Segarra +- fix: fixed wagon tests by:Jon +- fix: fix wagon list reload by:Jon +- fix: i18n en preparation label by:Javier Segarra +- fix: infiniteScroll by:Javier Segarra +- fix: isFullMovable checkbox by:Javier Segarra +- fix: merge conflicts by:Javier Segarra +- fix: merge in dev by:alexm +- fix: missing code by:Jon +- fix: Options VnSelect properties by:Javier Segarra +- fix: refs #4074 await to watch by:jorgep +- fix: refs #4074 drop wrong acl by:jorgep +- fix: refs #4074 workerCard data-key by:jorgep +- fix: refs #6346 fix list and create by:pablone +- fix: refs #6943 prevent null (origin/6943-warmfix-preventNull) by:jorgep +- fix: refs #7155 remove userParams in watcher (7155-travel_daysOnward) by:alexm +- fix: refs #7155 use chip-locale (origin/7155-travel_daysOnward_2, 7155-travel_daysOnward_2) by:alexm +- fix: refs #7404 remove console.log by:pablone +- fix: refs #7404 remove from test by:pablone +- fix: refs #7404 remove some style by:pablone +- fix: refs #7404 revert commit prevent production access by:pablone +- fix: refs #7404 style non center pop up (origin/7404-fixFront) by:pablone +- fix: refs #7404 translates and some minor style fixes by:pablone +- fix: refs #7500 fixed e2e test by:Jon +- fix: refs #7500 fixed showing images wrongly by:Jon +- fix: refs #7830 customer credit by:pablone +- fix: refs #7830 remove console.log by:pablone +- fix: remove console.log by:pablone +- fix: remove FetchData by:Javier Segarra +- fix: remove FIXME (origin/6943_fix_customerSummaryTable) by:Javier Segarra +- fix: remove print variable by:Javier Segarra +- fix: remove promise execution by:Javier Segarra +- fix: reset VnTable scroll properties by:Javier Segarra +- fix: rule by:Javier Segarra +- fix: solve conflicts from master to test by:Javier Segarra +- fix: split params (origin/warmfix-addSearchUrl) by:jorgep +- fix: state cell by:Javier Segarra +- fix: stop call back event hasMoreData by:Javier Segarra +- fix: styles by:Javier Segarra +- fix: SupplierFiscalData VnLocation (origin/fix_supplierFD_location) by:Javier Segarra +- fix: VnLocation test by:Javier Segarra +- fix(VnTable): header background-color by:alexm +- fix(VnTable): sanitizer value is defined by:carlossa +- fix: wagon reload (origin/FixWagonRedirect) by:Jon +- fix: workerDms filter workerFk by:alexm +- fix(WorkerList): add type email by:alexm +- Merge remote-tracking branch 'origin/7830-customerDesplegables' into 6943_fix_customerSummaryTable by:Javier Segarra +- refs #7155 scopeDays fix (origin/7155-scopeDays) by:carlossa +- revert: vnUSerLink change by:Javier Segarra +- test: fix test (7677_vnLocation_perf) by:Javier Segarra # Version 24.38 - 2024-09-17 ### Added ๐ -- chore: refs #6772 fix e2e (origin/6772-warmfix-fixE2e) by:jorgep -- chore: refs #7323 worker changes by:jorgep -- chore: refs #7353 fix warnings by:jorgep -- chore: refs #7353 use Vue component nomenclature by:jorgep -- chore: refs #7356 fix type by:jorgep -- feat(AccountConnections): use VnToken by:alexm -- feat: add key to routerView by:Javier Segarra -- feat: add plus shortcut in VnTable by:Javier Segarra -- feat: add row by:Javier Segarra -- feat: addRow withour dialog by:Javier Segarra -- feat: apply mixin by:Javier Segarra -- feat by:Javier Segarra -- feat: change navBar buttons by:Javier Segarra -- feat: dense rows by:Javier Segarra -- feat: fields with wrong name by:jgallego -- feat: fix bugs and filters by:Javier Segarra -- feat: fix refund parameters by:jgallego -- feat: handle create row by:Javier Segarra -- feat: handle dates by:Javier Segarra -- feat: handle qCheckbox 3rd state by:Javier Segarra -- feat: imrpove VnInputTime to set cursor at start by:Javier Segarra -- feat: keyShortcut directive by:Javier Segarra -- feat: minor fixes by:jgallego -- feat: only filter by isDestiny by:Javier Segarra -- feat: refs #211153 businessDataLinkGrafana by:robert -- feat: refs #7129 add km start and end on create form by:pablone -- feat: refs #7353 add filter & fix customTags by:jorgep -- feat: refs #7353 add locale by:jorgep -- feat: refs #7353 add no one opt by:jorgep -- feat: refs #7353 add right icons by:jorgep -- feat: refs #7353 imporve toDateFormat by:jorgep -- feat: refs #7353 salesPerson nickname & id by:jorgep -- feat: refs #7353 split sections by:jorgep -- feat: refs #7847 remove reload btn by:jorgep -- feat: refs #7847 remove reload fn by:jorgep -- feat: refs #7889 added shortcuts to modules by:Jon -- feat: refs #7911 added shortcut to modules by:Jon -- feat: refuncInvoiceForm component by:jgallego -- feat: remove duplicity by:Javier Segarra -- feat: remove future itemFixedPrices by:Javier Segarra -- feat: replace stickyButtons by subtoolbar by:Javier Segarra -- feat: required validation by:Javier Segarra -- feat: show bad dates by:Javier Segarra -- feat: showdate icons by:Javier Segarra -- feat: solve ItemFixedFilterPanel by:Javier Segarra -- feat: transfer an invoice by:jgallego -- feat: try to fix ItemFixedFilterPanel by:Javier Segarra -- feat: unnecessary changes by:Javier Segarra -- feat: update changelog (origin/7896_down_devToTest_2436) by:Javier Segarra -- feat: updates by:Javier Segarra -- feat: update version and changelog by:Javier Segarra -- feat: vnInput\* by:Javier Segarra -- feat: with VnTable by:Javier Segarra -- refs #6772 feat: fix approach by:Javier Segarra -- refs #6772 feat: refresh shelving.basic-data by:Javier Segarra -- style: show subName value by:Javier Segarra +- chore: refs #6772 fix e2e (origin/6772-warmfix-fixE2e) by:jorgep +- chore: refs #7323 worker changes by:jorgep +- chore: refs #7353 fix warnings by:jorgep +- chore: refs #7353 use Vue component nomenclature by:jorgep +- chore: refs #7356 fix type by:jorgep +- feat(AccountConnections): use VnToken by:alexm +- feat: add key to routerView by:Javier Segarra +- feat: add plus shortcut in VnTable by:Javier Segarra +- feat: add row by:Javier Segarra +- feat: addRow withour dialog by:Javier Segarra +- feat: apply mixin by:Javier Segarra +- feat by:Javier Segarra +- feat: change navBar buttons by:Javier Segarra +- feat: dense rows by:Javier Segarra +- feat: fields with wrong name by:jgallego +- feat: fix bugs and filters by:Javier Segarra +- feat: fix refund parameters by:jgallego +- feat: handle create row by:Javier Segarra +- feat: handle dates by:Javier Segarra +- feat: handle qCheckbox 3rd state by:Javier Segarra +- feat: imrpove VnInputTime to set cursor at start by:Javier Segarra +- feat: keyShortcut directive by:Javier Segarra +- feat: minor fixes by:jgallego +- feat: only filter by isDestiny by:Javier Segarra +- feat: refs #211153 businessDataLinkGrafana by:robert +- feat: refs #7129 add km start and end on create form by:pablone +- feat: refs #7353 add filter & fix customTags by:jorgep +- feat: refs #7353 add locale by:jorgep +- feat: refs #7353 add no one opt by:jorgep +- feat: refs #7353 add right icons by:jorgep +- feat: refs #7353 imporve toDateFormat by:jorgep +- feat: refs #7353 salesPerson nickname & id by:jorgep +- feat: refs #7353 split sections by:jorgep +- feat: refs #7847 remove reload btn by:jorgep +- feat: refs #7847 remove reload fn by:jorgep +- feat: refs #7889 added shortcuts to modules by:Jon +- feat: refs #7911 added shortcut to modules by:Jon +- feat: refuncInvoiceForm component by:jgallego +- feat: remove duplicity by:Javier Segarra +- feat: remove future itemFixedPrices by:Javier Segarra +- feat: replace stickyButtons by subtoolbar by:Javier Segarra +- feat: required validation by:Javier Segarra +- feat: show bad dates by:Javier Segarra +- feat: showdate icons by:Javier Segarra +- feat: solve ItemFixedFilterPanel by:Javier Segarra +- feat: transfer an invoice by:jgallego +- feat: try to fix ItemFixedFilterPanel by:Javier Segarra +- feat: unnecessary changes by:Javier Segarra +- feat: update changelog (origin/7896_down_devToTest_2436) by:Javier Segarra +- feat: updates by:Javier Segarra +- feat: update version and changelog by:Javier Segarra +- feat: vnInput\* by:Javier Segarra +- feat: with VnTable by:Javier Segarra +- refs #6772 feat: fix approach by:Javier Segarra +- refs #6772 feat: refresh shelving.basic-data by:Javier Segarra +- style: show subName value by:Javier Segarra ### Changed ๐ฆ -- perf: add v-shortcut in VnCard by:Javier Segarra -- perf: approach by:Javier Segarra -- perf: change directive location by:Javier Segarra -- perf: change slots order by:Javier Segarra -- perf: examples by:Javier Segarra -- perf: hide icon for VnInputDate by:Javier Segarra -- perf: improve ItemFixedPricefilterPanel by:Javier Segarra -- perf: improve mainShrotcutMixin by:Javier Segarra -- perf: minor clean code by:Javier Segarra -- perf: onRowchange by:Javier Segarra -- perf: order by by:Javier Segarra -- perf: order components by:Javier Segarra -- perf: refs #7889 perf shortcut test by:Jon -- perf: remove console.log by:Javier Segarra -- perf: remove icons in header slot by:Javier Segarra -- perf: remove print variables by:Javier Segarra -- perf: restore CustomerBasicData by:Javier Segarra -- refactor: deleted useless prop by:Jon -- refactor: deleted useless prop in FetchedTags by:Jon -- refactor: refs #7323 drop useless code by:jorgep -- refactor: refs #7353 clients correction by:jorgep -- refactor: refs #7353 clients correction wip by:jorgep -- refactor: refs #7353 ease logic by:jorgep -- refactor: refs #7353 order correction by:jorgep -- refactor: refs #7353 simplify code by:jorgep -- refactor: refs #7353 tickets correction by:jorgep -- refactor: refs #7353 use global locales by:jorgep -- refactor: refs #7354 changed descriptor menu options by:Jon -- refactor: refs #7354 changed icon color in table and notification when deleting a zone by:Jon -- refactor: refs #7354 fix tableFilters by:Jon -- refactor: refs #7354 modified VnInputTime by:Jon -- refactor: refs #7354 refactor deliveryPanel by:Jon -- refactor: refs #7354 refactor zones section and fixed e2e tests by:Jon -- refactor: refs #7354 requested changes by:Jon -- refactor: refs #7354 reverse deliveryPanel changes by:Jon -- refactor: refs #7354 Zone migration changes by:Jon -- refactor: refs #7889 deleted subtitle attr and use keyBinding instead by:Jon -- refactor: refs #7889 modified shortcut and dashboard, and added tootlip in LeftMenu by:Jon -- refs #6722 perf: not fetch when id not exists by:Javier Segarra -- refs #6772 perf: change variable name by:JAVIER SEGARRA MARTINEZ -- refs #6772 perf: use ArrayData (6772_reload_sections) by:Javier Segarra -- refs #7283 refactor fix ItemDescriptor by:carlossa -- refs #7283 refactor ItexDescriptor by:carlossa +- perf: add v-shortcut in VnCard by:Javier Segarra +- perf: approach by:Javier Segarra +- perf: change directive location by:Javier Segarra +- perf: change slots order by:Javier Segarra +- perf: examples by:Javier Segarra +- perf: hide icon for VnInputDate by:Javier Segarra +- perf: improve ItemFixedPricefilterPanel by:Javier Segarra +- perf: improve mainShrotcutMixin by:Javier Segarra +- perf: minor clean code by:Javier Segarra +- perf: onRowchange by:Javier Segarra +- perf: order by by:Javier Segarra +- perf: order components by:Javier Segarra +- perf: refs #7889 perf shortcut test by:Jon +- perf: remove console.log by:Javier Segarra +- perf: remove icons in header slot by:Javier Segarra +- perf: remove print variables by:Javier Segarra +- perf: restore CustomerBasicData by:Javier Segarra +- refactor: deleted useless prop by:Jon +- refactor: deleted useless prop in FetchedTags by:Jon +- refactor: refs #7323 drop useless code by:jorgep +- refactor: refs #7353 clients correction by:jorgep +- refactor: refs #7353 clients correction wip by:jorgep +- refactor: refs #7353 ease logic by:jorgep +- refactor: refs #7353 order correction by:jorgep +- refactor: refs #7353 simplify code by:jorgep +- refactor: refs #7353 tickets correction by:jorgep +- refactor: refs #7353 use global locales by:jorgep +- refactor: refs #7354 changed descriptor menu options by:Jon +- refactor: refs #7354 changed icon color in table and notification when deleting a zone by:Jon +- refactor: refs #7354 fix tableFilters by:Jon +- refactor: refs #7354 modified VnInputTime by:Jon +- refactor: refs #7354 refactor deliveryPanel by:Jon +- refactor: refs #7354 refactor zones section and fixed e2e tests by:Jon +- refactor: refs #7354 requested changes by:Jon +- refactor: refs #7354 reverse deliveryPanel changes by:Jon +- refactor: refs #7354 Zone migration changes by:Jon +- refactor: refs #7889 deleted subtitle attr and use keyBinding instead by:Jon +- refactor: refs #7889 modified shortcut and dashboard, and added tootlip in LeftMenu by:Jon +- refs #6722 perf: not fetch when id not exists by:Javier Segarra +- refs #6772 perf: change variable name by:JAVIER SEGARRA MARTINEZ +- refs #6772 perf: use ArrayData (6772_reload_sections) by:Javier Segarra +- refs #7283 refactor fix ItemDescriptor by:carlossa +- refs #7283 refactor ItexDescriptor by:carlossa ### Fixed ๐ ๏ธ -- chore: refs #6772 fix e2e (origin/6772-warmfix-fixE2e) by:jorgep -- chore: refs #7353 fix warnings by:jorgep -- chore: refs #7356 fix type by:jorgep -- feat: fix bugs and filters by:Javier Segarra -- feat: fix refund parameters by:jgallego -- feat: minor fixes by:jgallego -- feat: refs #7353 add filter & fix customTags by:jorgep -- feat: try to fix ItemFixedFilterPanel by:Javier Segarra -- fix: add border-top by:Javier Segarra -- fix: added missing descriptors and small details by:Jon -- fix branch by:carlossa -- fix: call upsert when crudModel haschanges by:Javier Segarra -- fix(ClaimList): fix summary by:alexm -- fix: cli warnings by:Javier Segarra -- fix: editTableOptions by:Javier Segarra -- fix events and descriptor menu by:Jon -- fix: InvoiceIn sections (origin/6772_reload_sections) by:Javier Segarra -- fix: minor changes by:Javier Segarra -- fix: minor error whit dates by:Javier Segarra -- fix: module icon by:Javier Segarra -- fix: options QDate by:Javier Segarra -- fix: refs #6900 e2e error by:jorgep -- fix: refs #6900 rollback by:jorgep -- fix: refs #7353 css by:jorgep -- fix: refs #7353 hide search param (origin/7353-warmfix-fixSearchbar) by:jorgep -- fix: refs #7353 iron out filter by:jorgep -- fix: refs #7353 iron out ticket table by:jorgep -- fix: refs #7353 padding by:jorgep -- fix: refs #7353 salesClientTable by:jorgep -- fix: refs #7353 salesorderTable by:jorgep -- fix: refs #7353 saleTicketMonitors by:jorgep -- fix: refs #7353 use same datakey by:jorgep -- fix: refs #7353 vnTable colors by:jorgep -- fix: refs #7354 e2e tests by:Jon -- fix: refs #7354 fix delivery days by:Jon -- fix: refs #7354 fix list searchbar and filters by:Jon -- fix: refs #7354 fix VnSearchbar search for zone section & finished basic tests by:Jon -- fix: refs #7354 fix VnTable filters and agency field by:Jon -- fix: refs #7354 fix zoneSearchbar by:Jon -- fix: refs #7354 requested changes by:Jon -- fix: refs #7356 colors by:jorgep -- fix: refs #7356 create claim dialog by:jorgep -- fix: refs #7889 fixed shortcut test by:Jon -- fix: refs #7903 fixed ticket's search bar and keybinding tooltip by:Jon -- fix: refs #7911 fixed shortcut and related files by:Jon -- fix: remove condition duplicated by:Javier Segarra -- fix: remove property by:Javier Segarra -- fix tootltip by:carlossa -- fix traduction by:carlossa -- fix(VnSectionMain): add QPage by:alexm -- fix(zone): zoneLocation and the others searchbar by:alexm -- refactor: refs #7354 fix tableFilters by:Jon -- refactor: refs #7354 refactor zones section and fixed e2e tests by:Jon -- refs #6772 feat: fix approach by:Javier Segarra -- refs #6772 fix: claimPhoto reload by:Javier Segarra -- refs #6896 fix searchbar by:carlossa -- refs #6897 fix entry by:carlossa -- refs #6899 fix invoiceFix by:carlossa -- refs #6899 fix order by:carlossa -- refs #7283 fix by:carlossa -- refs #7283 fix ItemDescriptor warehouse by:carlossa -- refs #7283 refactor fix ItemDescriptor by:carlossa -- refs #7355 #7366 fix account, summary, list, travelList, tooltip by:carlossa -- refs #7355 fix accountPrivileges by:carlossa -- refs #7355 fix accounts, vnTable by:carlossa -- refs #7355 fix privileges by:carlossa -- refs #7355 fix roles filters by:carlossa -- refs #7355 fix total by:carlossa -- refs #7355 fix views summarys, entryList, travelList refact by:carlossa -- refs #7366 fix travel hours by:carlossa -- test: fix e2e by:Javier Segarra +- chore: refs #6772 fix e2e (origin/6772-warmfix-fixE2e) by:jorgep +- chore: refs #7353 fix warnings by:jorgep +- chore: refs #7356 fix type by:jorgep +- feat: fix bugs and filters by:Javier Segarra +- feat: fix refund parameters by:jgallego +- feat: minor fixes by:jgallego +- feat: refs #7353 add filter & fix customTags by:jorgep +- feat: try to fix ItemFixedFilterPanel by:Javier Segarra +- fix: add border-top by:Javier Segarra +- fix: added missing descriptors and small details by:Jon +- fix branch by:carlossa +- fix: call upsert when crudModel haschanges by:Javier Segarra +- fix(ClaimList): fix summary by:alexm +- fix: cli warnings by:Javier Segarra +- fix: editTableOptions by:Javier Segarra +- fix events and descriptor menu by:Jon +- fix: InvoiceIn sections (origin/6772_reload_sections) by:Javier Segarra +- fix: minor changes by:Javier Segarra +- fix: minor error whit dates by:Javier Segarra +- fix: module icon by:Javier Segarra +- fix: options QDate by:Javier Segarra +- fix: refs #6900 e2e error by:jorgep +- fix: refs #6900 rollback by:jorgep +- fix: refs #7353 css by:jorgep +- fix: refs #7353 hide search param (origin/7353-warmfix-fixSearchbar) by:jorgep +- fix: refs #7353 iron out filter by:jorgep +- fix: refs #7353 iron out ticket table by:jorgep +- fix: refs #7353 padding by:jorgep +- fix: refs #7353 salesClientTable by:jorgep +- fix: refs #7353 salesorderTable by:jorgep +- fix: refs #7353 saleTicketMonitors by:jorgep +- fix: refs #7353 use same datakey by:jorgep +- fix: refs #7353 vnTable colors by:jorgep +- fix: refs #7354 e2e tests by:Jon +- fix: refs #7354 fix delivery days by:Jon +- fix: refs #7354 fix list searchbar and filters by:Jon +- fix: refs #7354 fix VnSearchbar search for zone section & finished basic tests by:Jon +- fix: refs #7354 fix VnTable filters and agency field by:Jon +- fix: refs #7354 fix zoneSearchbar by:Jon +- fix: refs #7354 requested changes by:Jon +- fix: refs #7356 colors by:jorgep +- fix: refs #7356 create claim dialog by:jorgep +- fix: refs #7889 fixed shortcut test by:Jon +- fix: refs #7903 fixed ticket's search bar and keybinding tooltip by:Jon +- fix: refs #7911 fixed shortcut and related files by:Jon +- fix: remove condition duplicated by:Javier Segarra +- fix: remove property by:Javier Segarra +- fix tootltip by:carlossa +- fix traduction by:carlossa +- fix(VnSectionMain): add QPage by:alexm +- fix(zone): zoneLocation and the others searchbar by:alexm +- refactor: refs #7354 fix tableFilters by:Jon +- refactor: refs #7354 refactor zones section and fixed e2e tests by:Jon +- refs #6772 feat: fix approach by:Javier Segarra +- refs #6772 fix: claimPhoto reload by:Javier Segarra +- refs #6896 fix searchbar by:carlossa +- refs #6897 fix entry by:carlossa +- refs #6899 fix invoiceFix by:carlossa +- refs #6899 fix order by:carlossa +- refs #7283 fix by:carlossa +- refs #7283 fix ItemDescriptor warehouse by:carlossa +- refs #7283 refactor fix ItemDescriptor by:carlossa +- refs #7355 #7366 fix account, summary, list, travelList, tooltip by:carlossa +- refs #7355 fix accountPrivileges by:carlossa +- refs #7355 fix accounts, vnTable by:carlossa +- refs #7355 fix privileges by:carlossa +- refs #7355 fix roles filters by:carlossa +- refs #7355 fix total by:carlossa +- refs #7355 fix views summarys, entryList, travelList refact by:carlossa +- refs #7366 fix travel hours by:carlossa +- test: fix e2e by:Javier Segarra # Version 24.36 - 2024-08-27 ### Added ๐ -- feat(FormModel): trim data by default by:alexm -- feat(orderBasicData): add notes by:alexm -- feat(orderList): correct create order by:alexm -- feat(orderList): use orderFilter and fixed this by:alexm -- feat: #7323 handle workerPhoto (origin/7323_workerPhoto, 7323_workerPhoto) by:Javier Segarra -- feat: add recover password and reset password by:alexm -- feat: refs #7346 add seriaType option by:jgallego -- feat: refs #7346 elimino === by:jgallego -- feat: refs #7346 formdata uses serialType by:jgallego -- feat: refs #7346 refactor by:jgallego -- feat: refs #7346 sonarLint warnings (origin/7346-invoiceOutMultilple, 7346-invoiceOutMultilple) by:jgallego -- feat: refs #7710 uses cloneAll by:jgallego -- fix: refs #7717 fix OrderList table filters' and summary table style by:Jon +- feat(FormModel): trim data by default by:alexm +- feat(orderBasicData): add notes by:alexm +- feat(orderList): correct create order by:alexm +- feat(orderList): use orderFilter and fixed this by:alexm +- feat: #7323 handle workerPhoto (origin/7323_workerPhoto, 7323_workerPhoto) by:Javier Segarra +- feat: add recover password and reset password by:alexm +- feat: refs #7346 add seriaType option by:jgallego +- feat: refs #7346 elimino === by:jgallego +- feat: refs #7346 formdata uses serialType by:jgallego +- feat: refs #7346 refactor by:jgallego +- feat: refs #7346 sonarLint warnings (origin/7346-invoiceOutMultilple, 7346-invoiceOutMultilple) by:jgallego +- feat: refs #7710 uses cloneAll by:jgallego +- fix: refs #7717 fix OrderList table filters' and summary table style by:Jon ### Changed ๐ฆ -- feat: refs #7346 refactor by:jgallego -- perf: date fields (mindshore/feature/TicketFutureFilter, feature/TicketFutureFilter) by:Javier Segarra -- perf: refs #7717 right menu filter by:Jon -- perf: use ref at component start by:Javier Segarra -- refactor: refs #7717 delete useless function and import by:Jon -- refactor: refs #7717 deleted useless code by:Jon +- feat: refs #7346 refactor by:jgallego +- perf: date fields (mindshore/feature/TicketFutureFilter, feature/TicketFutureFilter) by:Javier Segarra +- perf: refs #7717 right menu filter by:Jon +- perf: use ref at component start by:Javier Segarra +- refactor: refs #7717 delete useless function and import by:Jon +- refactor: refs #7717 deleted useless code by:Jon ### Fixed ๐ ๏ธ -- feat(orderList): use orderFilter and fixed this by:alexm -- fix(VnTable): orderBy v-model by:alexm -- fix(account_card): redirection by:carlossa -- fix(orderLines): reload when delete and redirect when confirm by:alexm -- fix: #6336 ClaimListStates by:Javier Segarra -- fix: account subsections cards by:carlossa -- fix: duplicate key by:Jon -- fix: order description to vnTable by:alexm -- fix: orderCatalogFilter order by:alexm -- fix: quasar build warnings (6336_claim_fix_states) by:Javier Segarra -- fix: refs #7717 fix OrderList table filters' and summary table style by:Jon -- fix: refs #7717 fix basic data form & minor errors by:Jon -- fix: refs #7717 fix catalog filter, searchbar redirect and search by:Jon -- fix: refs #7717 fix catalog searchbar and worker tests(refs #7323) by:Jon -- fix: refs #7717 fix order sections by:Jon -- fix: refs #7717 fix volume and lines redirect by:Jon -- fix: refs #7717 fixed searchbar filter with rightmenu filters' applied by:Jon -- fix: test by:alexm -- fix: ticketDescriptorMenu by:Javier Segarra -- refs #7355 account fixes by:carlossa +- feat(orderList): use orderFilter and fixed this by:alexm +- fix(VnTable): orderBy v-model by:alexm +- fix(account_card): redirection by:carlossa +- fix(orderLines): reload when delete and redirect when confirm by:alexm +- fix: #6336 ClaimListStates by:Javier Segarra +- fix: account subsections cards by:carlossa +- fix: duplicate key by:Jon +- fix: order description to vnTable by:alexm +- fix: orderCatalogFilter order by:alexm +- fix: quasar build warnings (6336_claim_fix_states) by:Javier Segarra +- fix: refs #7717 fix OrderList table filters' and summary table style by:Jon +- fix: refs #7717 fix basic data form & minor errors by:Jon +- fix: refs #7717 fix catalog filter, searchbar redirect and search by:Jon +- fix: refs #7717 fix catalog searchbar and worker tests(refs #7323) by:Jon +- fix: refs #7717 fix order sections by:Jon +- fix: refs #7717 fix volume and lines redirect by:Jon +- fix: refs #7717 fixed searchbar filter with rightmenu filters' applied by:Jon +- fix: test by:alexm +- fix: ticketDescriptorMenu by:Javier Segarra +- refs #7355 account fixes by:carlossa # Version 24.34 - 2024-08-20 ### Added ๐ -- chore: #6900 order params by:jorgep -- chore: refs #6900 drop console log by:jorgep -- chore: refs #6900 drop vnCurrency by:jorgep -- chore: refs #6900 fix e2e tests by:jorgep -- chore: refs #6900 mv rectificative logic by:jorgep -- chore: refs #6900 responsive code by:jorgep -- chore: refs #7283 drop array types by:jorgep -- chore: refs #7283 drop import by:jorgep -- chore: refs #7283 fix e2e logout by:jorgep -- chore: refs #7283 update VnAvatar title handling by:jorgep -- chore: refs #7323 fix test by:jorgep -- chore: refs #7323 remove unused import by:jorgep -- chore: refs #7323drop commented code by:jorgep -- feat(VnCard): use props searchbar by:alexm -- feat(customer): improve basicData to balance by:alexm -- feat(customer_balance): refs #6943 add functionality from salix by:alexm -- feat(customer_balance): refs #6943 translations by:alexm -- feat: refs #6130 husky commitLint config by:pablone -- feat: refs #6130 husky hooks by:pablone -- feat: refs #6900 add InvoiceInSerial by:jorgep -- feat: refs #6900 add locale by:jorgep -- feat: refs #6900 use VnTable & sort filter fields by:jorgep -- feat: refs #7323 add flex-wrap by:jorgep -- feat: refs #7323 add my account" btn & fix models log selectable by:jorgep -- feat: refs #7323 improve test by:jorgep +- chore: #6900 order params by:jorgep +- chore: refs #6900 drop console log by:jorgep +- chore: refs #6900 drop vnCurrency by:jorgep +- chore: refs #6900 fix e2e tests by:jorgep +- chore: refs #6900 mv rectificative logic by:jorgep +- chore: refs #6900 responsive code by:jorgep +- chore: refs #7283 drop array types by:jorgep +- chore: refs #7283 drop import by:jorgep +- chore: refs #7283 fix e2e logout by:jorgep +- chore: refs #7283 update VnAvatar title handling by:jorgep +- chore: refs #7323 fix test by:jorgep +- chore: refs #7323 remove unused import by:jorgep +- chore: refs #7323drop commented code by:jorgep +- feat(VnCard): use props searchbar by:alexm +- feat(customer): improve basicData to balance by:alexm +- feat(customer_balance): refs #6943 add functionality from salix by:alexm +- feat(customer_balance): refs #6943 translations by:alexm +- feat: refs #6130 husky commitLint config by:pablone +- feat: refs #6130 husky hooks by:pablone +- feat: refs #6900 add InvoiceInSerial by:jorgep +- feat: refs #6900 add locale by:jorgep +- feat: refs #6900 use VnTable & sort filter fields by:jorgep +- feat: refs #7323 add flex-wrap by:jorgep +- feat: refs #7323 add my account" btn & fix models log selectable by:jorgep +- feat: refs #7323 improve test by:jorgep ### Changed ๐ฆ -- refactor(customer_log: use VnLog by:alexm -- refactor(customer_recovery): to vnTable by:alexm -- refactor(customer_webAccess): FormModel by:alexm -- refactor: refs #7283 update avatar size and color by:jorgep +- refactor(customer_log: use VnLog by:alexm +- refactor(customer_recovery): to vnTable by:alexm +- refactor(customer_webAccess): FormModel by:alexm +- refactor: refs #7283 update avatar size and color by:jorgep ### Fixed ๐ ๏ธ -- chore: refs #6900 fix e2e tests by:jorgep -- chore: refs #7283 fix e2e logout by:jorgep -- chore: refs #7323 fix test by:jorgep -- feat: refs #7323 add my account" btn & fix models log selectable by:jorgep -- fix #7355 fix acls list by:carlossa -- fix(VnFilterPanel): emit userParams better by:alexm -- fix(claim_summary): url links (HEAD -> 7864_testToMaster_2434, origin/test, origin/7864_testToMaster_2434, test) by:alexm -- fix(customer_sms: fix reload by:alexm -- fix(twoFactor): unify code login and twoFactor by:alexm -- fix: VnCard VnSearchbar props by:alexm -- fix: accountMailAlias by:alexm -- fix: refs #6130 add commit lint modules by:pablone -- fix: refs #6130 pnpm-lock.yml by:pablone -- fix: refs #6900 improve loading by:jorgep -- fix: refs #6900 improve logic (origin/6900-addSerial) by:jorgep -- fix: refs #6900 improve logic by:jorgep -- fix: refs #6900 rectificative btn reactivity by:jorgep -- fix: refs #6900 use type number by:jorgep -- fix: refs #6900 vat & dueday by:jorgep -- fix: refs #6900 vat, dueday & intrastat by:jorgep -- fix: refs #6989 show entity name & default time from config table by:jorgep -- fix: refs #7283 basicData locale by:jorgep -- fix: refs #7283 itemLastEntries filter by:jorgep -- fix: refs #7283 itemTags & VnImg by:jorgep -- fix: refs #7283 locale by:jorgep -- fix: refs #7283 min-width vnImg by:jorgep -- fix: refs #7283 use vnAvatar & add optional zoom by:jorgep -- fix: refs #7283 userPanel pic by:jorgep -- fix: refs #7323 add department popup by:jorgep -- fix: refs #7323 add locale by:jorgep -- fix: refs #7323 css righ menu by:jorgep -- fix: refs #7323 data-key & add select by:jorgep -- fix: refs #7323 load all opts by:jorgep -- fix: refs #7323 righ menu bug by:jorgep -- fix: refs #7323 use global locale by:jorgep -- fix: refs #7323 use workerFilter (origin/7323-warmfix-fixErrors) by:jorgep -- fix: refs #7323 vnsubtoolbar css by:jorgep -- fix: refs #7323 wrong css by:jorgep -- refs #7355 fix Rol, alias by:carlossa -- refs #7355 fix accountAlias by:carlossa -- refs #7355 fix alias summary by:carlossa -- refs #7355 fix conflicts by:carlossa -- refs #7355 fix create Rol by:carlossa -- refs #7355 fix list by:carlossa -- refs #7355 fix lists redirects summary by:carlossa -- refs #7355 fix roles by:carlossa -- refs #7355 fix search exprBuilder by:carlossa -- refs #7355 fix vnTable by:carlossa +- chore: refs #6900 fix e2e tests by:jorgep +- chore: refs #7283 fix e2e logout by:jorgep +- chore: refs #7323 fix test by:jorgep +- feat: refs #7323 add my account" btn & fix models log selectable by:jorgep +- fix #7355 fix acls list by:carlossa +- fix(VnFilterPanel): emit userParams better by:alexm +- fix(claim_summary): url links (HEAD -> 7864_testToMaster_2434, origin/test, origin/7864_testToMaster_2434, test) by:alexm +- fix(customer_sms: fix reload by:alexm +- fix(twoFactor): unify code login and twoFactor by:alexm +- fix: VnCard VnSearchbar props by:alexm +- fix: accountMailAlias by:alexm +- fix: refs #6130 add commit lint modules by:pablone +- fix: refs #6130 pnpm-lock.yml by:pablone +- fix: refs #6900 improve loading by:jorgep +- fix: refs #6900 improve logic (origin/6900-addSerial) by:jorgep +- fix: refs #6900 improve logic by:jorgep +- fix: refs #6900 rectificative btn reactivity by:jorgep +- fix: refs #6900 use type number by:jorgep +- fix: refs #6900 vat & dueday by:jorgep +- fix: refs #6900 vat, dueday & intrastat by:jorgep +- fix: refs #6989 show entity name & default time from config table by:jorgep +- fix: refs #7283 basicData locale by:jorgep +- fix: refs #7283 itemLastEntries filter by:jorgep +- fix: refs #7283 itemTags & VnImg by:jorgep +- fix: refs #7283 locale by:jorgep +- fix: refs #7283 min-width vnImg by:jorgep +- fix: refs #7283 use vnAvatar & add optional zoom by:jorgep +- fix: refs #7283 userPanel pic by:jorgep +- fix: refs #7323 add department popup by:jorgep +- fix: refs #7323 add locale by:jorgep +- fix: refs #7323 css righ menu by:jorgep +- fix: refs #7323 data-key & add select by:jorgep +- fix: refs #7323 load all opts by:jorgep +- fix: refs #7323 righ menu bug by:jorgep +- fix: refs #7323 use global locale by:jorgep +- fix: refs #7323 use workerFilter (origin/7323-warmfix-fixErrors) by:jorgep +- fix: refs #7323 vnsubtoolbar css by:jorgep +- fix: refs #7323 wrong css by:jorgep +- refs #7355 fix Rol, alias by:carlossa +- refs #7355 fix accountAlias by:carlossa +- refs #7355 fix alias summary by:carlossa +- refs #7355 fix conflicts by:carlossa +- refs #7355 fix create Rol by:carlossa +- refs #7355 fix list by:carlossa +- refs #7355 fix lists redirects summary by:carlossa +- refs #7355 fix roles by:carlossa +- refs #7355 fix search exprBuilder by:carlossa +- refs #7355 fix vnTable by:carlossa # Version 24.32 - 2024-08-06 ### Added ๐ -- chore: refs #7197 drop space by:jorgep -- chore: refs #7197 drop useless attr by:jorgep -- chore: refs #7197 fix test by:jorgep -- chore: refs #7197 fix tests by:jorgep -- chore: refs #7197 fix unit tests by:jorgep -- chore: refs #7197 idrop useless class by:jorgep -- chore: refs #7197 improve form filling in Cypress tests by:jorgep -- chore: refs #7197 remove unused import by:jorgep -- feat: customerPayments card view by:alexm -- feat: refs #6943 lock grid mode by:jorgep -- feat: refs #6943 wip consumption filter by:jorgep -- feat: refs #7197 add correcting filter by:jorgep -- feat: refs #7197 add supplier activities filter option by:jorgep -- feat: refs #7197 summary responsive by:jorgep -- feat: refs #7323 fix descriptors, added VnTable and minor changes by:Jon -- feat: refs #7323 fixed tests, changed calendar styles and fix workerCreate by:Jon -- feat: refs #7356 list & weekly to VnTable and style fixes by:Jon -- feat: refs #7401 add menu options by:pablone -- feat: SalesClientTable by:Javier Segarra -- feat: salesOrderTable by:Javier Segarra -- feat: salesTicketTable by:Javier Segarra -- feat: VnTable SalesTicketTable by:Javier Segarra -- fix: columns style by:alexm +- chore: refs #7197 drop space by:jorgep +- chore: refs #7197 drop useless attr by:jorgep +- chore: refs #7197 fix test by:jorgep +- chore: refs #7197 fix tests by:jorgep +- chore: refs #7197 fix unit tests by:jorgep +- chore: refs #7197 idrop useless class by:jorgep +- chore: refs #7197 improve form filling in Cypress tests by:jorgep +- chore: refs #7197 remove unused import by:jorgep +- feat: customerPayments card view by:alexm +- feat: refs #6943 lock grid mode by:jorgep +- feat: refs #6943 wip consumption filter by:jorgep +- feat: refs #7197 add correcting filter by:jorgep +- feat: refs #7197 add supplier activities filter option by:jorgep +- feat: refs #7197 summary responsive by:jorgep +- feat: refs #7323 fix descriptors, added VnTable and minor changes by:Jon +- feat: refs #7323 fixed tests, changed calendar styles and fix workerCreate by:Jon +- feat: refs #7356 list & weekly to VnTable and style fixes by:Jon +- feat: refs #7401 add menu options by:pablone +- feat: SalesClientTable by:Javier Segarra +- feat: salesOrderTable by:Javier Segarra +- feat: salesTicketTable by:Javier Segarra +- feat: VnTable SalesTicketTable by:Javier Segarra +- fix: columns style by:alexm ### Changed ๐ฆ -- perf: LeftMenu show/hide by:Javier Segarra -- perf: refs #7356 TicketList state column by:Jon -- perf: VnFilterPanel (origin/7323_WorkerMigration_End) by:Javier Segarra -- perf: width SalesTicketsTable by:Javier Segarra -- refactor: #6943 wip use vnTable CustomerCredits by:jorgep -- refactor: CustomerNotifications use VnTable by:alexm -- refactor: CustomerPayments use VnTable by:alexm -- refactor: refs #7014 deleted main files and changed route files by:Jon -- refactor: refs #7014 improved route.js & deleted RouteMain by:Jon -- refactor: refs #7014 refactor <module>Main.vue by:Jon -- refactor: refs #7014 refactor ZoneCard, deleted ZoneMain & created basic tests for functionality by:Jon -- refactor: refs #7197 use invoiceInSearchbar & queryParams by:jorgep -- refactor: refs #7323 hidden column filter proposal by:Jon -- refactor: refs #7356 fixed VnTable filters by:Jon -- refactor: refs #7356 requested changes by:Jon -- refactor: wip use vnTable CustomerCredits by:jorgep +- perf: LeftMenu show/hide by:Javier Segarra +- perf: refs #7356 TicketList state column by:Jon +- perf: VnFilterPanel (origin/7323_WorkerMigration_End) by:Javier Segarra +- perf: width SalesTicketsTable by:Javier Segarra +- refactor: #6943 wip use vnTable CustomerCredits by:jorgep +- refactor: CustomerNotifications use VnTable by:alexm +- refactor: CustomerPayments use VnTable by:alexm +- refactor: refs #7014 deleted main files and changed route files by:Jon +- refactor: refs #7014 improved route.js & deleted RouteMain by:Jon +- refactor: refs #7014 refactor <module>Main.vue by:Jon +- refactor: refs #7014 refactor ZoneCard, deleted ZoneMain & created basic tests for functionality by:Jon +- refactor: refs #7197 use invoiceInSearchbar & queryParams by:jorgep +- refactor: refs #7323 hidden column filter proposal by:Jon +- refactor: refs #7356 fixed VnTable filters by:Jon +- refactor: refs #7356 requested changes by:Jon +- refactor: wip use vnTable CustomerCredits by:jorgep ### Fixed ๐ ๏ธ -- chore: refs #7197 fix test by:jorgep -- chore: refs #7197 fix tests by:jorgep -- chore: refs #7197 fix unit tests by:jorgep -- feat: refs #7323 fix descriptors, added VnTable and minor changes by:Jon -- feat: refs #7323 fixed tests, changed calendar styles and fix workerCreate by:Jon -- feat: refs #7356 list & weekly to VnTable and style fixes by:Jon -- fix(claim): small details (6336-claim-v6) by:alexm -- fix: columns style by:alexm -- fix: customer defaulter add amount order (6943-fixCustomer) by:alexm -- fix: customerDefaulter correct functionality by:alexm -- fix: customerNotifications filter by:alexm -- fix: fix conflicts by:Jon -- fix: refs #6101 fix TicketList by:Jon -- fix: refs #6891 worker tests by:jorgep -- fix: refs #6943 drop padding-left checkbox & create wrap mode vnRow by:jorgep -- fix: refs #6943 prevent undefined by:jorgep -- fix: refs #7014 fix tests by:Jon -- fix: refs #7014 fix wagon module by:Jon -- fix: refs #7197 add url InvoiceInSearchbar by:jorgep -- fix: refs #7197 amount reactivity by:jorgep -- fix: refs #7197 drop character by:jorgep -- fix: refs #7197 reactivity invoiceCorrection by:jorgep -- fix: refs #7197 responsive summary layout by:jorgep -- fix: refs #7197 rollback by:jorgep -- fix: refs #7197 rollback crudModel by:jorgep -- fix: refs #7197 setInvoiceInCorrecition by:jorgep -- fix: refs #7197 vat, intrastat, filter and list sections by:jorgep -- fix: refs #7323 fix department & email table filter by:Jon -- fix: refs #7323 fixed left filter by:Jon -- fix: refs #7323 fix workerTimeControl form by:Jon -- fix: refs #7401 fix routeForm by:pablone -- fix: refs #7401 remove console.log by:pablone -- fix: refs CAU 207504 fix itemDiary and logs by:Jon -- fix: workerCreate form street field to be always upperCase by:Jon -- hotfix: refs CAU #207614 fix sale.concept field by:Jon -- refactor: refs #7356 fixed VnTable filters by:Jon -- refs #6898 fix by:carlossa -- Ticket expedition initial load fix by:wbuezas +- chore: refs #7197 fix test by:jorgep +- chore: refs #7197 fix tests by:jorgep +- chore: refs #7197 fix unit tests by:jorgep +- feat: refs #7323 fix descriptors, added VnTable and minor changes by:Jon +- feat: refs #7323 fixed tests, changed calendar styles and fix workerCreate by:Jon +- feat: refs #7356 list & weekly to VnTable and style fixes by:Jon +- fix(claim): small details (6336-claim-v6) by:alexm +- fix: columns style by:alexm +- fix: customer defaulter add amount order (6943-fixCustomer) by:alexm +- fix: customerDefaulter correct functionality by:alexm +- fix: customerNotifications filter by:alexm +- fix: fix conflicts by:Jon +- fix: refs #6101 fix TicketList by:Jon +- fix: refs #6891 worker tests by:jorgep +- fix: refs #6943 drop padding-left checkbox & create wrap mode vnRow by:jorgep +- fix: refs #6943 prevent undefined by:jorgep +- fix: refs #7014 fix tests by:Jon +- fix: refs #7014 fix wagon module by:Jon +- fix: refs #7197 add url InvoiceInSearchbar by:jorgep +- fix: refs #7197 amount reactivity by:jorgep +- fix: refs #7197 drop character by:jorgep +- fix: refs #7197 reactivity invoiceCorrection by:jorgep +- fix: refs #7197 responsive summary layout by:jorgep +- fix: refs #7197 rollback by:jorgep +- fix: refs #7197 rollback crudModel by:jorgep +- fix: refs #7197 setInvoiceInCorrecition by:jorgep +- fix: refs #7197 vat, intrastat, filter and list sections by:jorgep +- fix: refs #7323 fix department & email table filter by:Jon +- fix: refs #7323 fixed left filter by:Jon +- fix: refs #7323 fix workerTimeControl form by:Jon +- fix: refs #7401 fix routeForm by:pablone +- fix: refs #7401 remove console.log by:pablone +- fix: refs CAU 207504 fix itemDiary and logs by:Jon +- fix: workerCreate form street field to be always upperCase by:Jon +- hotfix: refs CAU #207614 fix sale.concept field by:Jon +- refactor: refs #7356 fixed VnTable filters by:Jon +- refs #6898 fix by:carlossa +- Ticket expedition initial load fix by:wbuezas # Version 24.28 - 2024-07-09 ### Added ๐ -- Change header titles style by:wbuezas -- chore: refs #7436 fix e2e (origin/7436-showQCheckbox) by:jorgep -- feat: #7196 eslint (origin/7196-cjsToEsm) by:jgallego -- feat: adapt tu VnTable โ CrudModel by:alexm -- feat(CustomerFIlter): use correct table by:alexm -- feat(customerList): add searchbar by:alexm -- feat: customerList is customerExtendedList by:alexm -- feat: fixes #7196 by:jgallego -- feat: refs #6739 transferInvoice new checkbox and functionality by:Jon -- feat: refs #6825 create vnTable and add in CustomerExtendedList by:alexm -- feat: refs #6825 create vnTableColumn, cardActions by:alexm -- feat: refs #6825 fix modes by:alexm -- feat: refs #6825 qchip color by:alexm -- feat: refs #6825 right filter panel (6825-vnTable) by:alexm -- feat: refs #6825 scroll for table mode by:alexm -- feat: refs #6825 share filters, create popup by:alexm -- feat: refs #6825 VnComponent mix component and attrs Form to create new row by:alexm -- feat: refs #6825 VnTableFilter and VnPanelFilter init by:alexm -- feat: refs #6826 added rol summary link by:Jon -- feat: refs #6896 created VnImg and added to order module by:Jon -- feat: refs #6896 new filters by:Jon -- feat: refs #7129 fix some code and add order by:pablone -- feat: refs #7436 show checkbox by:jorgep -- feat: refs #7545 Deleted hasIncoterms client column (origin/7545-hasIncoterms) by:guillermo -- feat(TicketService): use correct format by:alexm -- feat(url): sepate filters by:alexm -- feat(VnFilter): merge objects by:alexm -- feat(VnTable): is-editable and use-model. fix: checkbox by:alexm -- feat(VnTable): refs #6825 actions sticky by:alexm -- feat(VnTable): refs #6825 addInWhere by:alexm -- feat(VnTable): refs #6825 dinamic columns by:alexm -- feat(VnTable): refs #6825 execute function when create by:alexm -- feat(VnTable): refs #6825 fix ellipsis and add titles by:alexm -- feat(VnTable): refs #6825 merge where's by:alexm -- feat(VnTable): refs #6825 move to folder. fix checkboxs by:alexm -- feat(VnTable): refs #6825 remove field prop. Add actions in table by:alexm -- feat(VnTable): refs #6825 use checkbox if startsWith 'is' or 'has' by:alexm -- feat(VnTable): refs #6825 VnTableChip component by:alexm -- feat(vnTable): reload data when change url by:alexm -- feat(WorkerFormation): add columnFilter by:alexm -- feat(WorkerFormation): is-editable and use-model by:alexm -- fix: notify icon style by:Javier Segarra -- refactor: refs #6896 fixed styles by:Jon -- Revert "feat: fixes #7196" by:alexm -- style: refs #6464 changed checkbox and qbtn styles by:Jon +- Change header titles style by:wbuezas +- chore: refs #7436 fix e2e (origin/7436-showQCheckbox) by:jorgep +- feat: #7196 eslint (origin/7196-cjsToEsm) by:jgallego +- feat: adapt tu VnTable โ CrudModel by:alexm +- feat(CustomerFIlter): use correct table by:alexm +- feat(customerList): add searchbar by:alexm +- feat: customerList is customerExtendedList by:alexm +- feat: fixes #7196 by:jgallego +- feat: refs #6739 transferInvoice new checkbox and functionality by:Jon +- feat: refs #6825 create vnTable and add in CustomerExtendedList by:alexm +- feat: refs #6825 create vnTableColumn, cardActions by:alexm +- feat: refs #6825 fix modes by:alexm +- feat: refs #6825 qchip color by:alexm +- feat: refs #6825 right filter panel (6825-vnTable) by:alexm +- feat: refs #6825 scroll for table mode by:alexm +- feat: refs #6825 share filters, create popup by:alexm +- feat: refs #6825 VnComponent mix component and attrs Form to create new row by:alexm +- feat: refs #6825 VnTableFilter and VnPanelFilter init by:alexm +- feat: refs #6826 added rol summary link by:Jon +- feat: refs #6896 created VnImg and added to order module by:Jon +- feat: refs #6896 new filters by:Jon +- feat: refs #7129 fix some code and add order by:pablone +- feat: refs #7436 show checkbox by:jorgep +- feat: refs #7545 Deleted hasIncoterms client column (origin/7545-hasIncoterms) by:guillermo +- feat(TicketService): use correct format by:alexm +- feat(url): sepate filters by:alexm +- feat(VnFilter): merge objects by:alexm +- feat(VnTable): is-editable and use-model. fix: checkbox by:alexm +- feat(VnTable): refs #6825 actions sticky by:alexm +- feat(VnTable): refs #6825 addInWhere by:alexm +- feat(VnTable): refs #6825 dinamic columns by:alexm +- feat(VnTable): refs #6825 execute function when create by:alexm +- feat(VnTable): refs #6825 fix ellipsis and add titles by:alexm +- feat(VnTable): refs #6825 merge where's by:alexm +- feat(VnTable): refs #6825 move to folder. fix checkboxs by:alexm +- feat(VnTable): refs #6825 remove field prop. Add actions in table by:alexm +- feat(VnTable): refs #6825 use checkbox if startsWith 'is' or 'has' by:alexm +- feat(VnTable): refs #6825 VnTableChip component by:alexm +- feat(vnTable): reload data when change url by:alexm +- feat(WorkerFormation): add columnFilter by:alexm +- feat(WorkerFormation): is-editable and use-model by:alexm +- fix: notify icon style by:Javier Segarra +- refactor: refs #6896 fixed styles by:Jon +- Revert "feat: fixes #7196" by:alexm +- style: refs #6464 changed checkbox and qbtn styles by:Jon ### Changed ๐ฆ -- perf: Remove div.col by:Javier Segarra -- perf: remove ItemPicture by:Javier Segarra -- perf: replace ItemPicture in favour of VnImg by:Javier Segarra -- refactor by:wbuezas -- refactor: refs #5447 changed warehouse filter by:Jon -- refactor: refs #5447 changed warehouse out filter behavior by:Jon -- refactor: refs #5447 fixed filter if continent not selected by:Jon -- refactor: refs #5447 fix request by:Jon -- refactor: refs #5447 refactor filters by:Jon -- refactor: refs #6739 changed invoice functions' name by:Jon -- refactor: refs #6739 changed router.push by:Jon -- refactor: refs #6739 deleted useless const by:Jon -- refactor: refs #6739 fix redirect transferInvoice by:Jon -- refactor: refs #6739 new confirmation window by:Jon -- refactor: refs #6739 requested changes by:Jon -- refactor: refs #6739 updated transferInvoice function by:Jon -- refactor: refs #6896 changes requested in PR by:Jon -- refactor: refs #6896 end migration orders by:Jon -- refactor: refs #6896 fixed styles by:Jon -- refactor: refs #6896 fix qdrawer by:Jon -- refactor: refs #6896 refactor VnImg by:Jon -- refactor: refs #6896 requested changes by:Jon -- refactor: refs #6977 fix VnImg props (origin/6977-ClonedURL) by:Jon -- refactor: refs #6977 refactor VnImg by:Jon -- refactor: refs #6977 use VnImg by:Jon -- refactors by:alexm +- perf: Remove div.col by:Javier Segarra +- perf: remove ItemPicture by:Javier Segarra +- perf: replace ItemPicture in favour of VnImg by:Javier Segarra +- refactor by:wbuezas +- refactor: refs #5447 changed warehouse filter by:Jon +- refactor: refs #5447 changed warehouse out filter behavior by:Jon +- refactor: refs #5447 fixed filter if continent not selected by:Jon +- refactor: refs #5447 fix request by:Jon +- refactor: refs #5447 refactor filters by:Jon +- refactor: refs #6739 changed invoice functions' name by:Jon +- refactor: refs #6739 changed router.push by:Jon +- refactor: refs #6739 deleted useless const by:Jon +- refactor: refs #6739 fix redirect transferInvoice by:Jon +- refactor: refs #6739 new confirmation window by:Jon +- refactor: refs #6739 requested changes by:Jon +- refactor: refs #6739 updated transferInvoice function by:Jon +- refactor: refs #6896 changes requested in PR by:Jon +- refactor: refs #6896 end migration orders by:Jon +- refactor: refs #6896 fixed styles by:Jon +- refactor: refs #6896 fix qdrawer by:Jon +- refactor: refs #6896 refactor VnImg by:Jon +- refactor: refs #6896 requested changes by:Jon +- refactor: refs #6977 fix VnImg props (origin/6977-ClonedURL) by:Jon +- refactor: refs #6977 refactor VnImg by:Jon +- refactor: refs #6977 use VnImg by:Jon +- refactors by:alexm ### Fixed ๐ ๏ธ -- chore: refs #7436 fix e2e (origin/7436-showQCheckbox) by:jorgep -- feat: fixes #7196 by:jgallego -- feat: refs #6825 fix modes by:alexm -- feat: refs #7129 fix some code and add order by:pablone -- feat(VnTable): is-editable and use-model. fix: checkbox by:alexm -- feat(VnTable): refs #6825 fix ellipsis and add titles by:alexm -- feat(VnTable): refs #6825 move to folder. fix checkboxs by:alexm -- fix(ArrayData): refs #6825 router.replace and use filter.where by:alexm -- fix: bug replace by:alexm -- fix: column hidden v-if by:Javier Segarra -- fix: comment 4 by:Javier Segarra -- fix: comments by:Javier Segarra -- fix: cypress.config to mjs by:alexm -- fix(EntryBuys): fix VnSubtoolbar by:alexm -- fixes: fix vnFilter params and redirect by:alexm -- fix: fix warnings by:alexm -- fix: invoiceDueDay test by:alexm -- fix log view not refreshing when changing id param by:wbuezas -- fix: map selected by:Javier Segarra -- fix: merge dev by:Javier Segarra -- fix: notify icon style by:Javier Segarra -- fix: point 1 by:Javier Segarra -- fix: point 3 by:Javier Segarra -- fix: refs #5447 deleted console.log by:Jon -- fix: refs 6464 deleted useless class in checkbox by:Jon -- fix: refs #6464 fix error isLoading by:Jon -- fix: refs #6739 changed checkbox field by:Jon -- fix: refs #6825 css by:carlossa -- fix: refs #6826 fix redirect by:Jon -- fix: refs #6826 fix roleDescriptor by:Jon -- fix: refs #7129 fix e2e by:pablone -- fix: refs #7129 fix module routes by:pablone -- fix: refs #7129 fix some issues on load and tools by:pablone -- fix: refs #7129 remove consoleLog by:pablone -- fix: refs #7129 remove fix from claim lines by:pablone -- fix: refs #7274 fix duplicate rows by:jorgep -- fix: refs #7433 skeleton by:jorgep -- fix: refs #7623 bugs & tests by:jorgep -- fix: refs #7623 disable router update by:jorgep -- fix: refs #7623 redirect by:jorgep -- fix: refs #7623 test by:jorgep -- fix: refs #7623 update add updateRoute prop in VnPaginate by:jorgep -- fix: refs #7623 updating skip param by:jorgep -- fix: revert cypress mjs by:alexm -- fix: SkeletonTable by:alexm -- fix: state translations by:Javier Segarra -- fix: ticket order by:Javier Segarra -- fix(ticket router): typo by:alexm -- fix(TicketService): pay use selected by:alexm -- fix: TravelLog by:Javier Segarra -- fix(url): filter by:alexm -- fix(url): redirect by:alexm -- fix(VnFilter): filter with params by:alexm -- fix(VnFilterPanel): remove key by:alexm -- fix(VnTable): create scss by:alexm -- fix(VnTable): duplicate fetch by:alexm -- fix(VnTable): Qtable v-bind by:alexm -- fix(VnTable): refs #6825 checkbox align and color by:alexm -- fix(VnTable): refs #6825 fix click sticky column by:alexm -- fix(VnTable): refs #6825 fix events and css by:alexm -- fix(VnTable): refs #6825 VnInputDate by:alexm -- fix(VnTable): showLabel by:alexm -- fix(VnTable): warns by:alexm -- fix: WorkerNotificationsManager test by:alexm -- fix: WorkerSelect option format by:Javier Segarra -- refactor: refs #5447 fixed filter if continent not selected by:Jon -- refactor: refs #5447 fix request by:Jon -- refactor: refs #6739 fix redirect transferInvoice by:Jon -- refactor: refs #6896 fixed styles by:Jon -- refactor: refs #6896 fix qdrawer by:Jon -- refactor: refs #6977 fix VnImg props (origin/6977-ClonedURL) by:Jon -- refs #6504 fix formModel claimFilter claimCard (origin/6504-fixCardClaim) by:carlossa -- refs #7406 fix components by:carlossa -- refs #7406 fix pr by:carlossa -- refs #7406 fix props by:carlossa -- refs #7406 fix Tb components create by:carlossa -- refs #7406 fix trad by:carlossa -- refs #7406 fix url by:carlossa -- refs #7406 fix VnTable columns by:carlossa -- refs #7409 fix balance and formation by:carlossa -- refs #7409 fix trad by:carlossa -- Revert "feat: fixes #7196" by:alexm -- test: fix intermitent e2e by:alexm -- test: fix vnSearchbar adapt to vnTable (origin/7648_dev_customerEntries) by:alexm +- chore: refs #7436 fix e2e (origin/7436-showQCheckbox) by:jorgep +- feat: fixes #7196 by:jgallego +- feat: refs #6825 fix modes by:alexm +- feat: refs #7129 fix some code and add order by:pablone +- feat(VnTable): is-editable and use-model. fix: checkbox by:alexm +- feat(VnTable): refs #6825 fix ellipsis and add titles by:alexm +- feat(VnTable): refs #6825 move to folder. fix checkboxs by:alexm +- fix(ArrayData): refs #6825 router.replace and use filter.where by:alexm +- fix: bug replace by:alexm +- fix: column hidden v-if by:Javier Segarra +- fix: comment 4 by:Javier Segarra +- fix: comments by:Javier Segarra +- fix: cypress.config to mjs by:alexm +- fix(EntryBuys): fix VnSubtoolbar by:alexm +- fixes: fix vnFilter params and redirect by:alexm +- fix: fix warnings by:alexm +- fix: invoiceDueDay test by:alexm +- fix log view not refreshing when changing id param by:wbuezas +- fix: map selected by:Javier Segarra +- fix: merge dev by:Javier Segarra +- fix: notify icon style by:Javier Segarra +- fix: point 1 by:Javier Segarra +- fix: point 3 by:Javier Segarra +- fix: refs #5447 deleted console.log by:Jon +- fix: refs 6464 deleted useless class in checkbox by:Jon +- fix: refs #6464 fix error isLoading by:Jon +- fix: refs #6739 changed checkbox field by:Jon +- fix: refs #6825 css by:carlossa +- fix: refs #6826 fix redirect by:Jon +- fix: refs #6826 fix roleDescriptor by:Jon +- fix: refs #7129 fix e2e by:pablone +- fix: refs #7129 fix module routes by:pablone +- fix: refs #7129 fix some issues on load and tools by:pablone +- fix: refs #7129 remove consoleLog by:pablone +- fix: refs #7129 remove fix from claim lines by:pablone +- fix: refs #7274 fix duplicate rows by:jorgep +- fix: refs #7433 skeleton by:jorgep +- fix: refs #7623 bugs & tests by:jorgep +- fix: refs #7623 disable router update by:jorgep +- fix: refs #7623 redirect by:jorgep +- fix: refs #7623 test by:jorgep +- fix: refs #7623 update add updateRoute prop in VnPaginate by:jorgep +- fix: refs #7623 updating skip param by:jorgep +- fix: revert cypress mjs by:alexm +- fix: SkeletonTable by:alexm +- fix: state translations by:Javier Segarra +- fix: ticket order by:Javier Segarra +- fix(ticket router): typo by:alexm +- fix(TicketService): pay use selected by:alexm +- fix: TravelLog by:Javier Segarra +- fix(url): filter by:alexm +- fix(url): redirect by:alexm +- fix(VnFilter): filter with params by:alexm +- fix(VnFilterPanel): remove key by:alexm +- fix(VnTable): create scss by:alexm +- fix(VnTable): duplicate fetch by:alexm +- fix(VnTable): Qtable v-bind by:alexm +- fix(VnTable): refs #6825 checkbox align and color by:alexm +- fix(VnTable): refs #6825 fix click sticky column by:alexm +- fix(VnTable): refs #6825 fix events and css by:alexm +- fix(VnTable): refs #6825 VnInputDate by:alexm +- fix(VnTable): showLabel by:alexm +- fix(VnTable): warns by:alexm +- fix: WorkerNotificationsManager test by:alexm +- fix: WorkerSelect option format by:Javier Segarra +- refactor: refs #5447 fixed filter if continent not selected by:Jon +- refactor: refs #5447 fix request by:Jon +- refactor: refs #6739 fix redirect transferInvoice by:Jon +- refactor: refs #6896 fixed styles by:Jon +- refactor: refs #6896 fix qdrawer by:Jon +- refactor: refs #6977 fix VnImg props (origin/6977-ClonedURL) by:Jon +- refs #6504 fix formModel claimFilter claimCard (origin/6504-fixCardClaim) by:carlossa +- refs #7406 fix components by:carlossa +- refs #7406 fix pr by:carlossa +- refs #7406 fix props by:carlossa +- refs #7406 fix Tb components create by:carlossa +- refs #7406 fix trad by:carlossa +- refs #7406 fix url by:carlossa +- refs #7406 fix VnTable columns by:carlossa +- refs #7409 fix balance and formation by:carlossa +- refs #7409 fix trad by:carlossa +- Revert "feat: fixes #7196" by:alexm +- test: fix intermitent e2e by:alexm +- test: fix vnSearchbar adapt to vnTable (origin/7648_dev_customerEntries) by:alexm # Version 24.24 - 2024-06-11 ### Added ๐ -- feat: 6942 hashtag in key : value summary by:jgallego -- feat: #6957: Rename FetchedTags instance tag by:Javier Segarra -- feat: refactor template by:Javier Segarra -- feat: refs #6600 Add option to add comment for photo motivation by:jorgep -- feat: refs #6942 test e2e tobook & toUnbook by:jorgep -- feat: refs #6942 to book summary button & reactive value by:jorgep -- feat: refs #6942 to unbook by:jorgep -- feat: refs #6942 url update by:jorgep -- feat: refs #6942 use correct currency in InvoiceIn components by:jorgep -- feat: refs #6942 vat rate total by:jorgep -- feat: refs #7494 new icons (7494-icons) by:alexm -- feat: refs #7494 new icons by:alexm -- feat: refs #7542 drop space by:jorgep -- feat: refs #7542 empty by:jorgep -- fix: refs #6942 changes and new features by:jorgep -- fix: style by:Javier Segarra -- style: color transparent when is fetive by:Javier Segarra -- style: fix color when is empty by:Javier Segarra -- style: reset poc style (6957_refactorFetechedTags) by:Javier Segarra -- style: reset poc style by:Javier Segarra -- style updates by:Javier Segarra +- feat: 6942 hashtag in key : value summary by:jgallego +- feat: #6957: Rename FetchedTags instance tag by:Javier Segarra +- feat: refactor template by:Javier Segarra +- feat: refs #6600 Add option to add comment for photo motivation by:jorgep +- feat: refs #6942 test e2e tobook & toUnbook by:jorgep +- feat: refs #6942 to book summary button & reactive value by:jorgep +- feat: refs #6942 to unbook by:jorgep +- feat: refs #6942 url update by:jorgep +- feat: refs #6942 use correct currency in InvoiceIn components by:jorgep +- feat: refs #6942 vat rate total by:jorgep +- feat: refs #7494 new icons (7494-icons) by:alexm +- feat: refs #7494 new icons by:alexm +- feat: refs #7542 drop space by:jorgep +- feat: refs #7542 empty by:jorgep +- fix: refs #6942 changes and new features by:jorgep +- fix: style by:Javier Segarra +- style: color transparent when is fetive by:Javier Segarra +- style: fix color when is empty by:Javier Segarra +- style: reset poc style (6957_refactorFetechedTags) by:Javier Segarra +- style: reset poc style by:Javier Segarra +- style updates by:Javier Segarra ### Changed ๐ฆ -- feat: refactor template by:Javier Segarra -- perf: 6957 add color as new shared variable by:Javier Segarra -- perf: 6957 change fetchedTags color by:Javier Segarra -- perf: remove local tree variable by:Javier Segarra -- refactor: add flat by:alexm -- refactor: refs #6600 replace QInput to VnInput by:jorgep -- refactor: refs #6652 improved defaulter section by:Jon -- refactor: refs #6942 Fix getTotalAmount function to correctly calculate the total amount in InvoiceInDueDay.vue by:jorgep -- refactor: refs #6942 new summary layout by:jorgep -- refactor: refs #6942 store key & actions by:jorgep -- refactor: refs #6942 summary by:jorgep -- refactor: refs #6942 use router hook by:jorgep -- refactor: refs #6942 WIP summary layout by:jorgep +- feat: refactor template by:Javier Segarra +- perf: 6957 add color as new shared variable by:Javier Segarra +- perf: 6957 change fetchedTags color by:Javier Segarra +- perf: remove local tree variable by:Javier Segarra +- refactor: add flat by:alexm +- refactor: refs #6600 replace QInput to VnInput by:jorgep +- refactor: refs #6652 improved defaulter section by:Jon +- refactor: refs #6942 Fix getTotalAmount function to correctly calculate the total amount in InvoiceInDueDay.vue by:jorgep +- refactor: refs #6942 new summary layout by:jorgep +- refactor: refs #6942 store key & actions by:jorgep +- refactor: refs #6942 summary by:jorgep +- refactor: refs #6942 use router hook by:jorgep +- refactor: refs #6942 WIP summary layout by:jorgep ### Fixed ๐ ๏ธ -- fix: 9-12 by:Javier Segarra -- fix: defaulter icon by:alexm -- fix: refs #5186 validation by:jorgep -- fix: refs #6095 add reFfk null on search by:pablone -- fix: refs #6942 cardDescriptor use store if its popup or different source data by:jorgep -- fix: refs #6942 changes and new features by:jorgep -- fix: refs #6942 drop comments by:jorgep -- fix: refs #6942 drop console by:jorgep -- fix: refs #6942 drop console.log by:jorgep -- fix: refs #6942 e2e test (origin/6942-warmfix-fixFormModel) by:jorgep -- fix: refs #6942 e2e tests by:jorgep -- fix: refs #6942 e2e tests by:jorgep -- fix: refs #6942 fix emit on data saved by:jorgep -- fix: refs #6942 fix emit on reset by:jorgep -- fix: refs #6942 fix vncard by:jorgep -- fix: refs #6942 formModel & CardDescriptor by:jorgep -- fix: refs #6942 formModel watch changes & invoiceInCreate by:jorgep -- fix: refs #6942 import by:jorgep -- fix: refs #6942 reloading by:jorgep -- fix: refs #6942 rollback by:jorgep -- fix: refs #6942 selectable expense by:jorgep -- fix: refs #6942 skip e2e tests by:jorgep -- fix: refs #6942 table bottom highlight & drop isBooked field by:jorgep -- fix: refs #6942 tests e2e by:jorgep -- fix: refs #6942 tests & summary table spacing by:jorgep -- fix: refs #6942 unit tests by:jorgep -- fix: refs #6942 vnLocation by:jorgep -- fix: refs #6942 wip: formModel by:jorgep -- fix: refs #7542 use right panel by:jorgep -- fix: searchbar redirect by:alexm -- fix: style by:Javier Segarra -- fix: WorkerCalendarItem by:Javier Segarra -- mini fix by:wbuezas -- refs #6111 clean code fix changes by:carlossa -- refs #6111 fix merge, fix column by:carlossa -- refs #6111 fix qtable, actions, scroll by:carlossa -- refs #6111 fix routeList by:carlossa -- refs #6111 fix sticky by:carlossa -- refs #6111 fix trad remove logs by:carlossa -- refs #6111 fix visibleColumns by:carlossa -- refs #6111 routeList fix by:carlossa -- refs #6332 fix calendar by:carlossa -- refs #6332 fix colors by:carlossa -- refs #6332 fix festive by:carlossa -- refs #6820 fix BasicData Tickets by:carlossa -- refs #6820 fix error front by:carlossa -- refs #6820 fix traduction by:carlossa -- refs #7391 fix textarea by:carlossa -- refs #7396 fix summary by:carlossa -- Search childs fix by:wbuezas -- small fix by:wbuezas -- style: fix color when is empty by:Javier Segarra +- fix: 9-12 by:Javier Segarra +- fix: defaulter icon by:alexm +- fix: refs #5186 validation by:jorgep +- fix: refs #6095 add reFfk null on search by:pablone +- fix: refs #6942 cardDescriptor use store if its popup or different source data by:jorgep +- fix: refs #6942 changes and new features by:jorgep +- fix: refs #6942 drop comments by:jorgep +- fix: refs #6942 drop console by:jorgep +- fix: refs #6942 drop console.log by:jorgep +- fix: refs #6942 e2e test (origin/6942-warmfix-fixFormModel) by:jorgep +- fix: refs #6942 e2e tests by:jorgep +- fix: refs #6942 e2e tests by:jorgep +- fix: refs #6942 fix emit on data saved by:jorgep +- fix: refs #6942 fix emit on reset by:jorgep +- fix: refs #6942 fix vncard by:jorgep +- fix: refs #6942 formModel & CardDescriptor by:jorgep +- fix: refs #6942 formModel watch changes & invoiceInCreate by:jorgep +- fix: refs #6942 import by:jorgep +- fix: refs #6942 reloading by:jorgep +- fix: refs #6942 rollback by:jorgep +- fix: refs #6942 selectable expense by:jorgep +- fix: refs #6942 skip e2e tests by:jorgep +- fix: refs #6942 table bottom highlight & drop isBooked field by:jorgep +- fix: refs #6942 tests e2e by:jorgep +- fix: refs #6942 tests & summary table spacing by:jorgep +- fix: refs #6942 unit tests by:jorgep +- fix: refs #6942 vnLocation by:jorgep +- fix: refs #6942 wip: formModel by:jorgep +- fix: refs #7542 use right panel by:jorgep +- fix: searchbar redirect by:alexm +- fix: style by:Javier Segarra +- fix: WorkerCalendarItem by:Javier Segarra +- mini fix by:wbuezas +- refs #6111 clean code fix changes by:carlossa +- refs #6111 fix merge, fix column by:carlossa +- refs #6111 fix qtable, actions, scroll by:carlossa +- refs #6111 fix routeList by:carlossa +- refs #6111 fix sticky by:carlossa +- refs #6111 fix trad remove logs by:carlossa +- refs #6111 fix visibleColumns by:carlossa +- refs #6111 routeList fix by:carlossa +- refs #6332 fix calendar by:carlossa +- refs #6332 fix colors by:carlossa +- refs #6332 fix festive by:carlossa +- refs #6820 fix BasicData Tickets by:carlossa +- refs #6820 fix error front by:carlossa +- refs #6820 fix traduction by:carlossa +- refs #7391 fix textarea by:carlossa +- refs #7396 fix summary by:carlossa +- Search childs fix by:wbuezas +- small fix by:wbuezas +- style: fix color when is empty by:Javier Segarra # Changelog @@ -1526,9 +1811,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added -- (Item) => Se aรฑade la opciรณn de aรฑadir un comentario del motivo de hacer una foto -- (Worker) => Se aรฑade la opciรณn de crear un trabajador ajeno a la empresa -- (Route) => Ahora se muestran todos los cmrs +- (Item) => Se aรฑade la opciรณn de aรฑadir un comentario del motivo de hacer una foto +- (Worker) => Se aรฑade la opciรณn de crear un trabajador ajeno a la empresa +- (Route) => Ahora se muestran todos los cmrs ## [2418.01] @@ -1536,27 +1821,27 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added -- (Worker) => Se crea la secciรณn Taquilla -- (General) => Se mantiene el filtro lateral en cualquier parte de la seccรญon. +- (Worker) => Se crea la secciรณn Taquilla +- (General) => Se mantiene el filtro lateral en cualquier parte de la seccรญon. ### Fixed -- (General) => Se vuelven a mostrar los parรกmetros en la url al aplicar un filtro +- (General) => Se vuelven a mostrar los parรกmetros en la url al aplicar un filtro ## [2414.01] - 2024-04-04 ### Added -- (Tickets) => Se aรฑade la opciรณn de clonar ticket. #6951 -- (Parking) => Se aรฑade la secciรณn Parking. #5186 +- (Tickets) => Se aรฑade la opciรณn de clonar ticket. #6951 +- (Parking) => Se aรฑade la secciรณn Parking. #5186 -- (Rutas) => Se aรฑade el campo "servida" a la tabla y se aรฑade tambiรฉn a los filtros. #7130 +- (Rutas) => Se aรฑade el campo "servida" a la tabla y se aรฑade tambiรฉn a los filtros. #7130 ### Changed ### Fixed -- (General) => Se corrige la redirecciรณn cuando hay 1 solo registro y cuando se aplica un filtro diferente al id al hacer una bรบsqueda general. #6893 +- (General) => Se corrige la redirecciรณn cuando hay 1 solo registro y cuando se aplica un filtro diferente al id al hacer una bรบsqueda general. #6893 ## [2400.01] - 2024-01-04 @@ -1570,26 +1855,26 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added -- (Carros) => Se aรฑade contador de carros. #6545 -- (Reclamaciones) => Se aรฑade la secciรณn para hacer acciones sobre una reclamaciรณn. #5654 +- (Carros) => Se aรฑade contador de carros. #6545 +- (Reclamaciones) => Se aรฑade la secciรณn para hacer acciones sobre una reclamaciรณn. #5654 ### Changed ### Fixed -- (Reclamaciones) => Se corrige el color de la barra segรบn el tema y el evento de actualziar cantidades #6334 +- (Reclamaciones) => Se corrige el color de la barra segรบn el tema y el evento de actualziar cantidades #6334 ## [2253.01] - 2023-01-05 ### Added -- (Clientes) => Aรฑadida nueva secciรณn "Pagos Web" para gestionar los pagos de todos los clientes -- (Tickets) => Aรฑadida opciรณn en el menรบ desplegable del ticket para enviar SMS al cliente -- (Reclamaciones) => Aรฑadida nueva secciรณn "Registros de auditorรญa" -- (Trabajadores) => Aรฑadido mรณdulo de trabajadores -- (General) => Aรฑadida barra de bรบsqueda general en los listados principales -- (Vagones) => Aรฑadido mรณdulo de vagones +- (Clientes) => Aรฑadida nueva secciรณn "Pagos Web" para gestionar los pagos de todos los clientes +- (Tickets) => Aรฑadida opciรณn en el menรบ desplegable del ticket para enviar SMS al cliente +- (Reclamaciones) => Aรฑadida nueva secciรณn "Registros de auditorรญa" +- (Trabajadores) => Aรฑadido mรณdulo de trabajadores +- (General) => Aรฑadida barra de bรบsqueda general en los listados principales +- (Vagones) => Aรฑadido mรณdulo de vagones ### Changed -- Changed... +- Changed... diff --git a/cypress.config.js b/cypress.config.js index a9e27fcfdcb..26b7725a52a 100644 --- a/cypress.config.js +++ b/cypress.config.js @@ -34,6 +34,17 @@ export default defineConfig({ const plugin = await import('cypress-mochawesome-reporter/plugin'); plugin.default(on); + const fs = await import('fs'); + on('task', { + deleteFile(filePath) { + if (fs.existsSync(filePath)) { + fs.unlinkSync(filePath); + return true; + } + return false; + }, + }); + return config; }, viewportWidth: 1280, diff --git a/package.json b/package.json index d23ed0cedd3..e78b0cf3c6f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "salix-front", - "version": "25.08.0", + "version": "25.10.0", "description": "Salix frontend", "productName": "Salix", "author": "Verdnatura", @@ -71,4 +71,4 @@ "vite": "^6.0.11", "vitest": "^0.31.1" } -} \ No newline at end of file +} diff --git a/src/boot/qformMixin.js b/src/boot/qformMixin.js index cb31391b33d..182c51e4793 100644 --- a/src/boot/qformMixin.js +++ b/src/boot/qformMixin.js @@ -30,22 +30,5 @@ export default { } catch (error) { console.error(error); } - form.addEventListener('keyup', function (evt) { - if (evt.key === 'Enter' && !that.$attrs['prevent-submit']) { - const input = evt.target; - if (input.type == 'textarea' && evt.shiftKey) { - evt.preventDefault(); - let { selectionStart, selectionEnd } = input; - input.value = - input.value.substring(0, selectionStart) + - '\n' + - input.value.substring(selectionEnd); - selectionStart = selectionEnd = selectionStart + 1; - return; - } - evt.preventDefault(); - that.onSubmit(); - } - }); }, }; diff --git a/src/components/CreateNewPostcodeForm.vue b/src/components/CreateNewPostcodeForm.vue index 39ebfe540c7..a57e2c01c28 100644 --- a/src/components/CreateNewPostcodeForm.vue +++ b/src/components/CreateNewPostcodeForm.vue @@ -2,7 +2,6 @@ import { reactive, ref } from 'vue'; import { useI18n } from 'vue-i18n'; -import FetchData from 'components/FetchData.vue'; import VnRow from 'components/ui/VnRow.vue'; import VnSelect from 'src/components/common/VnSelect.vue'; import VnSelectProvince from 'src/components/VnSelectProvince.vue'; @@ -21,14 +20,11 @@ const postcodeFormData = reactive({ provinceFk: null, townFk: null, }); -const townsFetchDataRef = ref(false); const townFilter = ref({}); const countriesRef = ref(false); const provincesOptions = ref([]); -const townsOptions = ref([]); const town = ref({}); -const countryFilter = ref({}); function onDataSaved(formData) { const newPostcode = { @@ -51,7 +47,6 @@ async function setCountry(countryFk, data) { data.townFk = null; data.provinceFk = null; data.countryFk = countryFk; - await fetchTowns(); } // Province @@ -60,22 +55,11 @@ async function setProvince(id, data) { const newProvince = provincesOptions.value.find((province) => province.id == id); if (newProvince) data.countryFk = newProvince.countryFk; postcodeFormData.provinceFk = id; - await fetchTowns(); } async function onProvinceCreated(data) { postcodeFormData.provinceFk = data.id; } -function provinceByCountry(countryFk = postcodeFormData.countryFk) { - return provincesOptions.value - .filter((province) => province.countryFk === countryFk) - .map(({ id }) => id); -} - -// Town -async function handleTowns(data) { - townsOptions.value = data; -} function setTown(newTown, data) { town.value = newTown; data.provinceFk = newTown?.provinceFk ?? newTown; @@ -88,18 +72,6 @@ async function onCityCreated(newTown, formData) { formData.townFk = newTown; setTown(newTown, formData); } -async function fetchTowns(countryFk = postcodeFormData.countryFk) { - if (!countryFk) return; - const provinces = postcodeFormData.provinceFk - ? [postcodeFormData.provinceFk] - : provinceByCountry(); - townFilter.value.where = { - provinceFk: { - inq: provinces, - }, - }; - await townsFetchDataRef.value?.fetch(); -} async function filterTowns(name) { if (name !== '') { @@ -108,22 +80,11 @@ async function filterTowns(name) { like: `%${name}%`, }, }; - await townsFetchDataRef.value?.fetch(); } } </script> <template> - <FetchData - ref="townsFetchDataRef" - :sort-by="['name ASC']" - :limit="30" - :filter="townFilter" - @on-fetch="handleTowns" - auto-load - url="Towns/location" - /> - <FormModelPopup url-create="postcodes" model="postcode" @@ -149,14 +110,13 @@ async function filterTowns(name) { @filter="filterTowns" :tooltip="t('Create city')" v-model="data.townFk" - :options="townsOptions" - option-label="name" - option-value="id" + url="Towns/location" :rules="validate('postcode.city')" :acls="[{ model: 'Town', props: '*', accessType: 'WRITE' }]" :emit-value="false" required data-cy="locationTown" + sort-by="name ASC" > <template #option="{ itemProps, opt }"> <QItem v-bind="itemProps"> @@ -197,16 +157,12 @@ async function filterTowns(name) { /> <VnSelect ref="countriesRef" - :limit="30" - :filter="countryFilter" :sort-by="['name ASC']" auto-load url="Countries" required :label="t('Country')" hide-selected - option-label="name" - option-value="id" v-model="data.countryFk" :rules="validate('postcode.countryFk')" @update:model-value="(value) => setCountry(value, data)" diff --git a/src/components/CreateNewProvinceForm.vue b/src/components/CreateNewProvinceForm.vue index d35690eebb9..1fc0c1f7a19 100644 --- a/src/components/CreateNewProvinceForm.vue +++ b/src/components/CreateNewProvinceForm.vue @@ -62,12 +62,9 @@ const where = computed(() => { auto-load :where="where" url="Autonomies/location" - :sort-by="['name ASC']" - :limit="30" + sort-by="name ASC" :label="t('Autonomy')" hide-selected - option-label="name" - option-value="id" v-model="data.autonomyFk" :rules="validate('province.autonomyFk')" > diff --git a/src/components/FilterItemForm.vue b/src/components/FilterItemForm.vue index 34968ccef3a..cacfde1b39a 100644 --- a/src/components/FilterItemForm.vue +++ b/src/components/FilterItemForm.vue @@ -42,7 +42,6 @@ const itemFilter = { const itemFilterParams = reactive({}); const closeButton = ref(null); const isLoading = ref(false); -const producersOptions = ref([]); const ItemTypesOptions = ref([]); const InksOptions = ref([]); const tableRows = ref([]); @@ -121,23 +120,17 @@ const selectItem = ({ id }) => { </script> <template> - <FetchData - url="Producers" - @on-fetch="(data) => (producersOptions = data)" - :filter="{ fields: ['id', 'name'], order: 'name ASC', limit: 30 }" - auto-load - /> <FetchData url="ItemTypes" - :filter="{ fields: ['id', 'name'], order: 'name ASC', limit: 30 }" - order="name" + :filter="{ fields: ['id', 'name'], order: 'name ASC' }" + order="name ASC" @on-fetch="(data) => (ItemTypesOptions = data)" auto-load /> <FetchData url="Inks" - :filter="{ fields: ['id', 'name'], order: 'name ASC', limit: 30 }" - order="name" + :filter="{ fields: ['id', 'name'], order: 'name ASC' }" + order="name ASC" @on-fetch="(data) => (InksOptions = data)" auto-load /> @@ -152,11 +145,11 @@ const selectItem = ({ id }) => { <VnInput :label="t('entry.buys.size')" v-model="itemFilterParams.size" /> <VnSelect :label="t('globals.producer')" - :options="producersOptions" hide-selected - option-label="name" - option-value="id" v-model="itemFilterParams.producerFk" + url="Producers" + :fields="['id', 'name']" + sort-by="name ASC" /> <VnSelect :label="t('globals.type')" diff --git a/src/components/FilterTravelForm.vue b/src/components/FilterTravelForm.vue index ab50d0899d1..765d97763f0 100644 --- a/src/components/FilterTravelForm.vue +++ b/src/components/FilterTravelForm.vue @@ -124,7 +124,7 @@ const selectTravel = ({ id }) => { <FetchData url="AgencyModes" @on-fetch="(data) => (agenciesOptions = data)" - :filter="{ fields: ['id', 'name'], order: 'name ASC', limit: 30 }" + :filter="{ fields: ['id', 'name'], order: 'name ASC' }" auto-load /> <FetchData diff --git a/src/components/FormModel.vue b/src/components/FormModel.vue index 5a59f301e97..04ef13d45c3 100644 --- a/src/components/FormModel.vue +++ b/src/components/FormModel.vue @@ -1,6 +1,6 @@ <script setup> import axios from 'axios'; -import { onMounted, onUnmounted, computed, ref, watch, nextTick } from 'vue'; +import { onMounted, onUnmounted, computed, ref, watch, nextTick, useAttrs } from 'vue'; import { onBeforeRouteLeave, useRouter, useRoute } from 'vue-router'; import { useI18n } from 'vue-i18n'; import { useQuasar } from 'quasar'; @@ -22,6 +22,7 @@ const { validate } = useValidator(); const { notify } = useNotify(); const route = useRoute(); const myForm = ref(null); +const attrs = useAttrs(); const $props = defineProps({ url: { type: String, @@ -106,14 +107,14 @@ const isLoading = ref(false); const isResetting = ref(false); const hasChanges = ref(!$props.observeFormChanges); const originalData = computed(() => state.get(modelValue)); -const formData = ref({}); +const formData = ref(); const defaultButtons = computed(() => ({ save: { dataCy: 'saveDefaultBtn', color: 'primary', icon: 'save', label: 'globals.save', - click: () => myForm.value.onSubmit(false), + click: async () => await save(), type: 'submit', }, reset: { @@ -134,7 +135,8 @@ onMounted(async () => { if (!$props.formInitialData) { if ($props.autoLoad && $props.url) await fetch(); - else if (arrayData.store.data) updateAndEmit('onFetch', arrayData.store.data); + else if (arrayData.store.data) + updateAndEmit('onFetch', { val: arrayData.store.data }); } if ($props.observeFormChanges) { watch( @@ -154,7 +156,7 @@ onMounted(async () => { if (!$props.url) watch( () => arrayData.store.data, - (val) => updateAndEmit('onFetch', val), + (val) => updateAndEmit('onFetch', { val }), ); watch( @@ -200,15 +202,14 @@ async function fetch() { }); if (Array.isArray(data)) data = data[0] ?? {}; - updateAndEmit('onFetch', data); + updateAndEmit('onFetch', { val: data }); } catch (e) { state.set(modelValue, {}); throw e; } } -async function save(prevent = false) { - if (prevent) return; +async function save() { if ($props.observeFormChanges && !hasChanges.value) return notify('globals.noChanges', 'negative'); @@ -228,7 +229,11 @@ async function save(prevent = false) { if ($props.urlCreate) notify('globals.dataCreated', 'positive'); - updateAndEmit('onDataSaved', formData.value, response?.data); + updateAndEmit('onDataSaved', { + val: formData.value, + res: response?.data, + old: originalData.value, + }); if ($props.reload) await arrayData.fetch({}); hasChanges.value = false; } finally { @@ -243,7 +248,7 @@ async function saveAndGo() { function reset() { formData.value = JSON.parse(JSON.stringify(originalData.value)); - updateAndEmit('onFetch', originalData.value); + updateAndEmit('onFetch', { val: originalData.value }); if ($props.observeFormChanges) { hasChanges.value = false; isResetting.value = true; @@ -265,11 +270,11 @@ function filter(value, update, filterOptions) { ); } -function updateAndEmit(evt, val, res) { +function updateAndEmit(evt, { val, res, old } = { val: null, res: null, old: null }) { state.set(modelValue, val); if (!$props.url) arrayData.store.data = val; - emit(evt, state.get(modelValue), res); + emit(evt, state.get(modelValue), res, old); } function trimData(data) { @@ -280,6 +285,22 @@ function trimData(data) { return data; } +async function onKeyup(evt) { + if (evt.key === 'Enter' && !('prevent-submit' in attrs)) { + const input = evt.target; + if (input.type == 'textarea' && evt.shiftKey) { + let { selectionStart, selectionEnd } = input; + input.value = + input.value.substring(0, selectionStart) + + '\n' + + input.value.substring(selectionEnd); + selectionStart = selectionEnd = selectionStart + 1; + return; + } + await save(); + } +} + defineExpose({ save, isLoading, @@ -294,12 +315,12 @@ defineExpose({ <QForm ref="myForm" v-if="formData" - @submit="save(!!$event)" + @submit.prevent + @keyup.prevent="onKeyup" @reset="reset" class="q-pa-md" :style="maxWidth ? 'max-width: ' + maxWidth : ''" id="formModel" - :prevent-submit="$attrs['prevent-submit']" > <QCard> <slot diff --git a/src/components/FormModelPopup.vue b/src/components/FormModelPopup.vue index 98b6117431e..672eeff7a23 100644 --- a/src/components/FormModelPopup.vue +++ b/src/components/FormModelPopup.vue @@ -27,10 +27,15 @@ const formModelRef = ref(null); const closeButton = ref(null); const isSaveAndContinue = ref(false); const onDataSaved = (formData, requestResponse) => { - if (closeButton.value && isSaveAndContinue) closeButton.value.click(); + if (closeButton.value && !isSaveAndContinue.value) closeButton.value.click(); emit('onDataSaved', formData, requestResponse); }; +const onClick = async (saveAndContinue) => { + isSaveAndContinue.value = saveAndContinue; + await formModelRef.value.save(); +}; + const isLoading = computed(() => formModelRef.value?.isLoading); const reset = computed(() => formModelRef.value?.reset); @@ -78,10 +83,7 @@ defineExpose({ :flat="showSaveAndContinueBtn" :label="t('globals.save')" :title="t('globals.save')" - @click=" - formModelRef.save(); - isSaveAndContinue = false; - " + @click="onClick(false)" color="primary" class="q-ml-sm" :disabled="isLoading" @@ -99,10 +101,7 @@ defineExpose({ :loading="isLoading" data-cy="FormModelPopup_isSaveAndContinue" z-max - @click=" - isSaveAndContinue = true; - formModelRef.save(); - " + @click="onClick(true)" /> </div> </template> diff --git a/src/components/ItemsFilterPanel.vue b/src/components/ItemsFilterPanel.vue index b6209d8e2d6..f73753a6bcc 100644 --- a/src/components/ItemsFilterPanel.vue +++ b/src/components/ItemsFilterPanel.vue @@ -121,23 +121,25 @@ const removeTag = (index, params, search) => { applyTags(params, search); }; const setCategoryList = (data) => { - categoryList.value = (data || []) - .filter((category) => category.display) - .map((category) => ({ - ...category, - icon: `vn:${(category.icon || '').split('-')[1]}`, - })); + categoryList.value = (data || []).map((category) => ({ + ...category, + icon: `vn:${(category.icon || '').split('-')[1]}`, + })); fetchItemTypes(); }; </script> <template> - <FetchData url="ItemCategories" limit="30" auto-load @on-fetch="setCategoryList" /> + <FetchData + url="ItemCategories" + auto-load + @on-fetch="setCategoryList" + :where="{ display: { neq: 0 } }" + /> <FetchData url="Tags" :filter="{ fields: ['id', 'name', 'isFree'] }" auto-load - limit="30" @on-fetch="(data) => (tagOptions = data)" /> <VnFilterPanel @@ -195,8 +197,6 @@ const setCategoryList = (data) => { :label="t('components.itemsFilterPanel.typeFk')" v-model="params.typeFk" :options="itemTypesOptions" - option-value="id" - option-label="name" dense outlined rounded @@ -234,7 +234,6 @@ const setCategoryList = (data) => { :label="t('globals.tag')" v-model="value.selectedTag" :options="tagOptions" - option-label="name" dense outlined rounded diff --git a/src/components/TicketProblems.vue b/src/components/TicketProblems.vue index a24735a5f33..783f2556fe8 100644 --- a/src/components/TicketProblems.vue +++ b/src/components/TicketProblems.vue @@ -1,8 +1,22 @@ <script setup> +import { toCurrency } from 'src/filters'; + defineProps({ row: { type: Object, required: true } }); </script> <template> <span class="q-gutter-x-xs"> + <router-link + v-if="row.claim?.claimFk" + :to="{ name: 'ClaimBasicData', params: { id: row.claim?.claimFk } }" + class="link" + > + <QIcon name="vn:claims" size="xs"> + <QTooltip> + {{ t('ticketSale.claim') }}: + {{ row.claim?.claimFk }} + </QTooltip> + </QIcon> + </router-link> <QIcon v-if="row?.risk" name="vn:risk" @@ -10,7 +24,8 @@ defineProps({ row: { type: Object, required: true } }); size="xs" > <QTooltip> - {{ $t('salesTicketsTable.risk') }}: {{ row.risk - row.credit }} + {{ $t('salesTicketsTable.risk') }}: + {{ toCurrency(row.risk - row.credit) }} </QTooltip> </QIcon> <QIcon @@ -53,7 +68,7 @@ defineProps({ row: { type: Object, required: true } }); <QTooltip>{{ $t('salesTicketsTable.purchaseRequest') }}</QTooltip> </QIcon> <QIcon - v-if="!row?.isTaxDataChecked === 0" + v-if="row?.isTaxDataChecked !== 0" name="vn:no036" color="primary" size="xs" diff --git a/src/components/VnTable/VnColumn.vue b/src/components/VnTable/VnColumn.vue index 44364cca171..d0e24538880 100644 --- a/src/components/VnTable/VnColumn.vue +++ b/src/components/VnTable/VnColumn.vue @@ -1,6 +1,6 @@ <script setup> import { markRaw, computed } from 'vue'; -import { QIcon, QCheckbox, QToggle } from 'quasar'; +import { QIcon, QToggle } from 'quasar'; import { dashIfEmpty } from 'src/filters'; import VnSelect from 'components/common/VnSelect.vue'; diff --git a/src/components/VnTable/VnFilter.vue b/src/components/VnTable/VnFilter.vue index 2dad8fe52ef..0de3834eadb 100644 --- a/src/components/VnTable/VnFilter.vue +++ b/src/components/VnTable/VnFilter.vue @@ -152,7 +152,7 @@ const onTabPressed = async () => { }; </script> <template> - <div v-if="showFilter" class="full-width flex-center" style="overflow: hidden"> + <div v-if="showFilter" class="full-width" style="overflow: hidden"> <VnColumn :column="$props.column" default="input" diff --git a/src/components/VnTable/VnOrder.vue b/src/components/VnTable/VnOrder.vue index e3795cc4ba8..47ed9acf4ff 100644 --- a/src/components/VnTable/VnOrder.vue +++ b/src/components/VnTable/VnOrder.vue @@ -23,6 +23,10 @@ const $props = defineProps({ type: Boolean, default: false, }, + align: { + type: String, + default: 'end', + }, }); const hover = ref(); const arrayData = useArrayData($props.dataKey, { searchUrl: $props.searchUrl }); @@ -46,16 +50,27 @@ async function orderBy(name, direction) { } defineExpose({ orderBy }); + +function textAlignToFlex(textAlign) { + return `justify-content: ${ + { + 'text-center': 'center', + 'text-left': 'start', + 'text-right': 'end', + }[textAlign] || 'start' + };`; +} </script> <template> <div @mouseenter="hover = true" @mouseleave="hover = false" @click="orderBy(name, model?.direction)" - class="row items-center no-wrap cursor-pointer title" + class="items-center no-wrap cursor-pointer title" + :style="textAlignToFlex(align)" > <span :title="label">{{ label }}</span> - <sup v-if="name && model?.index"> + <div v-if="name && model?.index"> <QChip :label="!vertical ? model?.index : ''" :icon=" @@ -92,20 +107,16 @@ defineExpose({ orderBy }); /> </div> </QChip> - </sup> + </div> </div> </template> <style lang="scss" scoped> .title { display: flex; - justify-content: center; align-items: center; height: 30px; width: 100%; color: var(--vn-label-color); -} -sup { - vertical-align: super; /* Valor predeterminado */ - /* Tambiรฉn puedes usar otros valores como "baseline", "top", "text-top", etc. */ + white-space: nowrap; } </style> diff --git a/src/components/VnTable/VnTable.vue b/src/components/VnTable/VnTable.vue index 99a4057c763..fe4806193d1 100644 --- a/src/components/VnTable/VnTable.vue +++ b/src/components/VnTable/VnTable.vue @@ -10,14 +10,15 @@ import { render, inject, useAttrs, + nextTick, } from 'vue'; import { useArrayData } from 'src/composables/useArrayData'; import { useI18n } from 'vue-i18n'; import { useRoute, useRouter } from 'vue-router'; -import { useQuasar } from 'quasar'; +import { useQuasar, date } from 'quasar'; import { useStateStore } from 'stores/useStateStore'; import { useFilterParams } from 'src/composables/useFilterParams'; -import { dashIfEmpty } from 'src/filters'; +import { dashIfEmpty, toDate } from 'src/filters'; import CrudModel from 'src/components/CrudModel.vue'; import FormModelPopup from 'components/FormModelPopup.vue'; @@ -164,7 +165,6 @@ const app = inject('app'); const editingRow = ref(null); const editingField = ref(null); const isTableMode = computed(() => mode.value == TABLE_MODE); -const showRightIcon = computed(() => $props.rightSearch || $props.rightSearchIcon); const selectRegex = /select/; const emit = defineEmits(['onFetch', 'update:selected', 'saveChanges']); const tableModes = [ @@ -345,7 +345,7 @@ const clickHandler = async (event) => { if (isDateElement || isTimeElement || isQselectDropDown) return; if (clickedElement === null) { - destroyInput(editingRow.value, editingField.value); + await destroyInput(editingRow.value, editingField.value); return; } const rowIndex = clickedElement.getAttribute('data-row-index'); @@ -353,19 +353,19 @@ const clickHandler = async (event) => { const column = $props.columns.find((col) => col.name === colField); if (editingRow.value !== null && editingField.value !== null) { - if (editingRow.value === rowIndex && editingField.value === colField) { - return; - } + if (editingRow.value == rowIndex && editingField.value == colField) return; - destroyInput(editingRow.value, editingField.value); + await destroyInput(editingRow.value, editingField.value); } - if (isEditableColumn(column)) + + if (isEditableColumn(column)) { await renderInput(Number(rowIndex), colField, clickedElement); + } }; async function handleTabKey(event, rowIndex, colField) { if (editingRow.value == rowIndex && editingField.value == colField) - destroyInput(editingRow.value, editingField.value); + await destroyInput(editingRow.value, editingField.value); const direction = event.shiftKey ? -1 : 1; const { nextRowIndex, nextColumnName } = await handleTabNavigation( @@ -425,7 +425,8 @@ async function renderInput(rowId, field, clickedElement) { await column?.cellEvent?.['update:modelValue']?.(value, oldValue, row); }, keyup: async (event) => { - if (event.key === 'Enter') handleBlur(rowId, field, clickedElement); + if (event.key === 'Enter') + await destroyInput(rowIndex, field, clickedElement); }, keydown: async (event) => { switch (event.key) { @@ -434,7 +435,7 @@ async function renderInput(rowId, field, clickedElement) { event.stopPropagation(); break; case 'Escape': - destroyInput(rowId, field, clickedElement); + await destroyInput(rowId, field, clickedElement); break; default: break; @@ -456,12 +457,13 @@ async function renderInput(rowId, field, clickedElement) { node.el?.querySelector('span > div > div').focus(); } -function destroyInput(rowIndex, field, clickedElement) { +async function destroyInput(rowIndex, field, clickedElement) { if (!clickedElement) clickedElement = document.querySelector( `[data-row-index="${rowIndex}"][data-col-field="${field}"]`, ); if (clickedElement) { + await nextTick(); render(null, clickedElement); Array.from(clickedElement.childNodes).forEach((child) => { child.style.visibility = 'visible'; @@ -473,10 +475,6 @@ function destroyInput(rowIndex, field, clickedElement) { editingField.value = null; } -function handleBlur(rowIndex, field, clickedElement) { - destroyInput(rowIndex, field, clickedElement); -} - async function handleTabNavigation(rowIndex, colName, direction) { const columns = $props.columns; const totalColumns = columns.length; @@ -492,9 +490,7 @@ async function handleTabNavigation(rowIndex, colName, direction) { if (isEditableColumn(columns[newColumnIndex])) break; } while (iterations < totalColumns); - if (iterations >= totalColumns) { - return; - } + if (iterations >= totalColumns + 1) return; if (direction === 1 && newColumnIndex <= currentColumnIndex) { rowIndex++; @@ -523,17 +519,44 @@ function getToggleIcon(value) { } function formatColumnValue(col, row, dashIfEmpty) { - if (col?.format) { + if (col?.format || row[col?.name + 'TextValue']) { if (selectRegex.test(col?.component) && row[col?.name + 'TextValue']) { return dashIfEmpty(row[col?.name + 'TextValue']); } else { return col.format(row, dashIfEmpty); } - } else { - return dashIfEmpty(row[col?.name]); } + + if (col?.component === 'date') return dashIfEmpty(toDate(row[col?.name])); + + if (col?.component === 'time') + return row[col?.name] >= 5 + ? dashIfEmpty(date.formatDate(new Date(row[col?.name]), 'HH:mm')) + : row[col?.name]; + + if (selectRegex.test(col?.component) && $props.isEditable) { + const { find, url } = col.attrs; + const urlRelation = url?.charAt(0)?.toLocaleLowerCase() + url?.slice(1, -1); + + if (col?.attrs.options) { + const find = col?.attrs.options.find((option) => option.id === row[col.name]); + if (!col.attrs?.optionLabel || !find) return dashIfEmpty(row[col?.name]); + return dashIfEmpty(find[col.attrs?.optionLabel ?? 'name']); + } + + if (typeof row[urlRelation] == 'object') { + if (typeof find == 'object') + return dashIfEmpty(row[urlRelation][find?.label ?? 'name']); + + return dashIfEmpty(row[urlRelation][col?.attrs.optionLabel ?? 'name']); + } + if (typeof row[urlRelation] == 'string') return dashIfEmpty(row[urlRelation]); + } + return dashIfEmpty(row[col?.name]); +} +function cardClick(_, row) { + if ($props.redirect) router.push({ path: `/${$props.redirect}/${row.id}` }); } -const checkbox = ref(null); </script> <template> <QDrawer @@ -617,29 +640,21 @@ const checkbox = ref(null); dense :options="tableModes.filter((mode) => !mode.disable)" /> - - <QBtn - v-if="showRightIcon" - icon="filter_alt" - class="bg-vn-section-color q-ml-sm" - dense - @click="stateStore.toggleRightDrawer()" - /> </template> <template #header-cell="{ col }"> <QTh v-if="col.visible ?? true" + v-bind:class="col.headerClass" class="body-cell" :style="col?.width ? `max-width: ${col?.width}` : ''" - style="padding: inherit" > <div class="no-padding" - :style=" - withFilters && $props.columnSearch ? 'height: 75px' : '' - " + :style="[ + withFilters && $props.columnSearch ? 'height: 75px' : '', + ]" > - <div class="text-center" style="height: 30px"> + <div style="height: 30px"> <QTooltip v-if="col.toolTip">{{ col.toolTip }}</QTooltip> <VnTableOrder v-model="orders[col.orderBy ?? col.name]" @@ -647,6 +662,7 @@ const checkbox = ref(null); :label="col?.labelAbbreviation ?? col?.label" :data-key="$attrs['data-key']" :search-url="searchUrl" + :align="getColAlign(col)" /> </div> <VnFilter @@ -728,7 +744,11 @@ const checkbox = ref(null); <span v-else :class="hasEditableFormat(col)" - :style="col?.style ? col.style(row) : null" + :style=" + typeof col?.style == 'function' + ? col.style(row) + : col?.style + " style="bottom: 0" > {{ formatColumnValue(col, row, dashIfEmpty) }} @@ -755,7 +775,7 @@ const checkbox = ref(null); flat dense :class=" - btn.isPrimary ? 'text-primary-light' : 'color-vn-text ' + btn.isPrimary ? 'text-primary-light' : 'color-vn-label' " :style="`visibility: ${ ((btn.show && btn.show(row)) ?? true) @@ -763,23 +783,19 @@ const checkbox = ref(null); : 'hidden' }`" @click="btn.action(row)" + :data-cy="btn?.name ?? `tableAction-${index}`" /> </QTd> </template> <template #item="{ row, colsMap }"> <component - :is="$props.redirect ? 'router-link' : 'span'" - :to="`/${$props.redirect}/` + row.id" + v-bind:is="'div'" + @click="(event) => cardClick(event, row)" > <QCard bordered flat class="row no-wrap justify-between cursor-pointer q-pa-sm" - @click=" - (_, row) => { - $props.rowClick && $props.rowClick(row); - } - " style="height: 100%" > <QCardSection @@ -816,7 +832,7 @@ const checkbox = ref(null); </QCardSection> <!-- Fields --> <QCardSection - class="q-pl-sm q-pr-lg q-py-xs" + class="q-pl-sm q-py-xs" :class="$props.cardClass" > <div @@ -863,13 +879,14 @@ const checkbox = ref(null); :key="index" :title="btn.title" :icon="btn.icon" + data-cy="cardBtn" class="q-pa-xs" - flat :class=" btn.isPrimary ? 'text-primary-light' - : 'color-vn-text ' + : 'color-vn-label' " + flat @click="btn.action(row)" /> </QCardSection> @@ -1027,8 +1044,8 @@ es: } .body-cell { - padding-left: 2px !important; - padding-right: 2px !important; + padding-left: 4px !important; + padding-right: 4px !important; position: relative; } .bg-chip-secondary { @@ -1048,7 +1065,7 @@ es: .grid-three { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, max-content)); - max-width: 100%; + width: 100%; grid-gap: 20px; margin: 0 auto; } @@ -1122,6 +1139,7 @@ es: .vn-label-value { display: flex; flex-direction: row; + align-items: center; color: var(--vn-text-color); .value { overflow: hidden; diff --git a/src/components/__tests__/FormModel.spec.js b/src/components/__tests__/FormModel.spec.js index 17812f1468c..3dce043749d 100644 --- a/src/components/__tests__/FormModel.spec.js +++ b/src/components/__tests__/FormModel.spec.js @@ -57,6 +57,7 @@ describe('FormModel', () => { vm.state.set(model, formInitialData); expect(vm.hasChanges).toBe(false); + await vm.$nextTick(); vm.formData.mockKey = 'newVal'; await vm.$nextTick(); expect(vm.hasChanges).toBe(true); @@ -94,8 +95,12 @@ describe('FormModel', () => { it('should call axios.patch with the right data', async () => { const spy = vi.spyOn(axios, 'patch').mockResolvedValue({ data: {} }); const { vm } = mount({ propsData: { url, model } }); - vm.formData.mockKey = 'newVal'; + + vm.formData = {}; await vm.$nextTick(); + vm.formData = { mockKey: 'newVal' }; + await vm.$nextTick(); + await vm.save(); expect(spy).toHaveBeenCalled(); vm.formData.mockKey = 'mockVal'; diff --git a/src/components/common/VnCardBeta.vue b/src/components/common/VnCardBeta.vue index d2bed62575c..7c82316dc44 100644 --- a/src/components/common/VnCardBeta.vue +++ b/src/components/common/VnCardBeta.vue @@ -39,6 +39,13 @@ onBeforeMount(async () => { }); onBeforeRouteUpdate(async (to, from) => { + if (hasRouteParam(to.params)) { + const { matched } = router.currentRoute.value; + const { name } = matched.at(-3); + if (name) { + router.push({ name, params: to.params }); + } + } const id = to.params.id; if (id !== from.params.id) await fetch(id, true); }); @@ -50,6 +57,9 @@ async function fetch(id, append = false) { else arrayData.store.url = props.url.replace(regex, `/${id}`); await arrayData.fetch({ append, updateRouter: false }); } +function hasRouteParam(params, valueToCheck = ':addressId') { + return Object.values(params).includes(valueToCheck); +} </script> <template> <Teleport to="#left-panel" v-if="stateStore.isHeaderMounted()"> diff --git a/src/components/common/VnComponent.vue b/src/components/common/VnComponent.vue index d9d1ea26b4a..a9e1c8cffc9 100644 --- a/src/components/common/VnComponent.vue +++ b/src/components/common/VnComponent.vue @@ -48,7 +48,8 @@ function toValueAttrs(attrs) { <span v-for="toComponent of componentArray" :key="toComponent.name" - class="column flex-center fit" + class="column fit" + :class="toComponent?.component == 'checkbox' ? 'flex-center' : ''" > <component v-if="toComponent?.component" diff --git a/src/components/common/VnInputDate.vue b/src/components/common/VnInputDate.vue index 73c825e1e26..1f4705faa15 100644 --- a/src/components/common/VnInputDate.vue +++ b/src/components/common/VnInputDate.vue @@ -107,6 +107,7 @@ const manageDate = (date) => { @click="isPopupOpen = !isPopupOpen" @keydown="isPopupOpen = false" hide-bottom-space + :data-cy="$attrs.dataCy ?? $attrs.label + '_inputDate'" > <template #append> <QIcon diff --git a/src/components/common/VnLocation.vue b/src/components/common/VnLocation.vue index 3ede24274d9..5028e876dae 100644 --- a/src/components/common/VnLocation.vue +++ b/src/components/common/VnLocation.vue @@ -85,6 +85,7 @@ const handleModelValue = (data) => { :tooltip="t('Create new location')" :rules="mixinRules" :lazy-rules="true" + required > <template #form> <CreateNewPostcode diff --git a/src/components/ui/CardDescriptor.vue b/src/components/ui/CardDescriptor.vue index e6e7e6fa0f1..6f122ecd28b 100644 --- a/src/components/ui/CardDescriptor.vue +++ b/src/components/ui/CardDescriptor.vue @@ -193,22 +193,24 @@ const toModule = computed(() => </div> </QItemLabel> <QItem> - <QItemLabel class="subtitle" caption> + <QItemLabel class="subtitle"> #{{ getValueFromPath(subtitle) ?? entity.id }} - <QBtn - round - flat - dense - size="sm" - icon="content_copy" - color="primary" - @click.stop="copyIdText(entity.id)" - > - <QTooltip> - {{ t('globals.copyId') }} - </QTooltip> - </QBtn> </QItemLabel> + + <QBtn + round + flat + dense + size="sm" + icon="content_copy" + color="primary" + @click.stop="copyIdText(entity.id)" + > + <QTooltip> + {{ t('globals.copyId') }} + </QTooltip> + </QBtn> + <!-- </QItemLabel> --> </QItem> </QList> <div class="list-box q-mt-xs"> diff --git a/src/components/ui/VnUsesMana.vue b/src/components/ui/VnUsesMana.vue index 1ad4a706e93..cb066b2359c 100644 --- a/src/components/ui/VnUsesMana.vue +++ b/src/components/ui/VnUsesMana.vue @@ -53,3 +53,8 @@ const manaCode = ref(props.manaCode); /> </div> </template> +<i18n> + es: + Promotion mana: Manรก promociรณn + Claim mana: Manรก reclamaciรณn +</i18n> diff --git a/src/composables/__tests__/useRequired.spec.js b/src/composables/__tests__/useRequired.spec.js new file mode 100644 index 00000000000..e035a80c6c7 --- /dev/null +++ b/src/composables/__tests__/useRequired.spec.js @@ -0,0 +1,66 @@ +import { describe, it, expect, vi } from 'vitest'; +import { useRequired } from '../useRequired'; + +vi.mock('../useValidator', () => ({ + useValidator: () => ({ + validations: () => ({ + required: vi.fn((isRequired, val) => { + if (!isRequired) return true; + return val !== null && val !== undefined && val !== ''; + }), + }), + }), +})); + +describe('useRequired', () => { + it('should detect required when attr is boolean true', () => { + const attrs = { required: true }; + const { isRequired } = useRequired(attrs); + expect(isRequired).toBe(true); + }); + + it('should detect required when attr is boolean false', () => { + const attrs = { required: false }; + const { isRequired } = useRequired(attrs); + expect(isRequired).toBe(false); + }); + + it('should detect required when attr exists without value', () => { + const attrs = { required: '' }; + const { isRequired } = useRequired(attrs); + expect(isRequired).toBe(true); + }); + + it('should return false when required attr does not exist', () => { + const attrs = { someOtherAttr: 'value' }; + const { isRequired } = useRequired(attrs); + expect(isRequired).toBe(false); + }); + + describe('requiredFieldRule', () => { + it('should validate required field with value', () => { + const attrs = { required: true }; + const { requiredFieldRule } = useRequired(attrs); + expect(requiredFieldRule('some value')).toBe(true); + }); + + it('should validate required field with empty value', () => { + const attrs = { required: true }; + const { requiredFieldRule } = useRequired(attrs); + expect(requiredFieldRule('')).toBe(false); + }); + + it('should pass validation when field is not required', () => { + const attrs = { required: false }; + const { requiredFieldRule } = useRequired(attrs); + expect(requiredFieldRule('')).toBe(true); + }); + + it('should handle null and undefined values', () => { + const attrs = { required: true }; + const { requiredFieldRule } = useRequired(attrs); + expect(requiredFieldRule(null)).toBe(false); + expect(requiredFieldRule(undefined)).toBe(false); + }); + }); +}); diff --git a/src/composables/getColAlign.js b/src/composables/getColAlign.js index c0338a98401..a930fd7d86c 100644 --- a/src/composables/getColAlign.js +++ b/src/composables/getColAlign.js @@ -1,13 +1,14 @@ export function getColAlign(col) { let align; switch (col.component) { + case 'time': + case 'date': case 'select': align = 'left'; break; case 'number': align = 'right'; break; - case 'date': case 'checkbox': align = 'center'; break; diff --git a/src/composables/useCau.js b/src/composables/useCau.js index a71300464b2..43bfc5180b7 100644 --- a/src/composables/useCau.js +++ b/src/composables/useCau.js @@ -11,7 +11,7 @@ export async function useCau(res, message) { const { config, headers, request, status, statusText, data } = res || {}; const { params, url, method, signal, headers: confHeaders } = config || {}; const { message: resMessage, code, name } = data?.error || {}; - delete confHeaders.Authorization; + delete confHeaders?.Authorization; const additionalData = { path: location.hash, diff --git a/src/composables/useRequired.js b/src/composables/useRequired.js index d211b96b459..4e84b9e48c4 100644 --- a/src/composables/useRequired.js +++ b/src/composables/useRequired.js @@ -2,14 +2,10 @@ import { useValidator } from 'src/composables/useValidator'; export function useRequired($attrs) { const { validations } = useValidator(); - const hasRequired = Object.keys($attrs).includes('required'); - let isRequired = false; - if (hasRequired) { - const required = $attrs['required']; - if (typeof required === 'boolean') { - isRequired = required; - } - } + const isRequired = + typeof $attrs['required'] === 'boolean' + ? $attrs['required'] + : Object.keys($attrs).includes('required'); const requiredFieldRule = (val) => validations().required(isRequired, val); return { diff --git a/src/css/app.scss b/src/css/app.scss index 0c5dc97fa7e..994ae7ff112 100644 --- a/src/css/app.scss +++ b/src/css/app.scss @@ -335,3 +335,7 @@ input::-webkit-inner-spin-button { border: 1px solid; box-shadow: 0 4px 6px #00000000; } + +.containerShrinked { + width: 80%; +} diff --git a/src/filters/toDate.js b/src/filters/toDate.js index 8fe8f383662..002797af528 100644 --- a/src/filters/toDate.js +++ b/src/filters/toDate.js @@ -3,6 +3,8 @@ import { useI18n } from 'vue-i18n'; export default function (value, options = {}) { if (!value) return; + if (!isValidDate(value)) return null; + if (!options.dateStyle && !options.timeStyle) { options.day = '2-digit'; options.month = '2-digit'; @@ -10,7 +12,12 @@ export default function (value, options = {}) { } const { locale } = useI18n(); - const date = new Date(value); + const newDate = new Date(value); - return new Intl.DateTimeFormat(locale.value, options).format(date); + return new Intl.DateTimeFormat(locale.value, options).format(newDate); +} +// handle 0000-00-00 +function isValidDate(date) { + const parsedDate = new Date(date); + return parsedDate instanceof Date && !isNaN(parsedDate.getTime()); } diff --git a/src/i18n/locale/en.yml b/src/i18n/locale/en.yml index e3b69004239..9a60e9da138 100644 --- a/src/i18n/locale/en.yml +++ b/src/i18n/locale/en.yml @@ -49,6 +49,7 @@ globals: rowRemoved: Row removed pleaseWait: Please wait... noPinnedModules: You don't have any pinned modules + enterToConfirm: Press Enter to confirm summary: basicData: Basic data daysOnward: Days onward @@ -830,6 +831,8 @@ travel: CloneTravelAndEntries: Clone travel and his entries deleteTravel: Delete travel AddEntry: Add entry + availabled: Availabled + availabledHour: Availabled hour thermographs: Thermographs hb: HB basicData: diff --git a/src/i18n/locale/es.yml b/src/i18n/locale/es.yml index 1dbe253664e..846c442ea51 100644 --- a/src/i18n/locale/es.yml +++ b/src/i18n/locale/es.yml @@ -51,6 +51,7 @@ globals: pleaseWait: Por favor espera... noPinnedModules: No has fijado ningรบn mรณdulo split: Split + enterToConfirm: Pulsa Enter para confirmar summary: basicData: Datos bรกsicos daysOnward: Dรญas adelante @@ -839,6 +840,7 @@ supplier: verified: Verificado isActive: Estรก activo billingData: Forma de pago + financialData: Datos financieros payDeadline: Plazo de pago payDay: Dรญa de pago account: Cuenta @@ -916,6 +918,8 @@ travel: deleteTravel: Eliminar envรญo AddEntry: Aรฑadir entrada thermographs: Termรณgrafos + availabled: F. Disponible + availabledHour: Hora Disponible hb: HB basicData: daysInForward: Desplazamiento automatico (redada) diff --git a/src/pages/Account/Card/AccountDescriptorMenu.vue b/src/pages/Account/Card/AccountDescriptorMenu.vue index a06329c6d02..30584c61f46 100644 --- a/src/pages/Account/Card/AccountDescriptorMenu.vue +++ b/src/pages/Account/Card/AccountDescriptorMenu.vue @@ -158,7 +158,7 @@ onMounted(() => { > <QItemSection>{{ t('globals.delete') }}</QItemSection> </QItem> - <QItem v-if="hasSysadminAccess" v-ripple clickable> + <QItem v-if="hasSysadminAccess || isHimself" v-ripple clickable> <QItemSection @click="onChangePass(isHimself)"> {{ isHimself ? t('globals.changePass') : t('globals.setPass') }} </QItemSection> diff --git a/src/pages/Claim/Card/ClaimPhoto.vue b/src/pages/Claim/Card/ClaimPhoto.vue index fb2f818c161..d4acc9bbe27 100644 --- a/src/pages/Claim/Card/ClaimPhoto.vue +++ b/src/pages/Claim/Card/ClaimPhoto.vue @@ -156,7 +156,6 @@ function onDrag() { url="Claims" :filter="claimDmsFilter" @on-fetch="([data]) => setClaimDms(data)" - limit="20" auto-load ref="claimDmsRef" /> diff --git a/src/pages/Customer/Card/CustomerBillingData.vue b/src/pages/Customer/Card/CustomerBillingData.vue index cfea8b0700c..cc894d01e64 100644 --- a/src/pages/Customer/Card/CustomerBillingData.vue +++ b/src/pages/Customer/Card/CustomerBillingData.vue @@ -17,8 +17,7 @@ const bankEntitiesRef = ref(null); const filter = { fields: ['id', 'bic', 'name'], - order: 'bic ASC', - limit: 30, + order: 'bic ASC' }; const getBankEntities = (data, formData) => { diff --git a/src/pages/Customer/Card/CustomerConsumption.vue b/src/pages/Customer/Card/CustomerConsumption.vue index eef9d55b5b2..f3949bb32d7 100644 --- a/src/pages/Customer/Card/CustomerConsumption.vue +++ b/src/pages/Customer/Card/CustomerConsumption.vue @@ -232,7 +232,6 @@ const updateDateParams = (value, params) => { :include="'category'" :sortBy="'name ASC'" dense - @update:model-value="(data) => updateDateParams(data, params)" > <template #option="scope"> <QItem v-bind="scope.itemProps"> @@ -254,7 +253,6 @@ const updateDateParams = (value, params) => { :fields="['id', 'name']" :sortBy="'name ASC'" dense - @update:model-value="(data) => updateDateParams(data, params)" /> <VnSelect v-model="params.campaign" @@ -303,12 +301,14 @@ en: valentinesDay: Valentine's Day mothersDay: Mother's Day allSaints: All Saints' Day + frenchMothersDay: Mother's Day in France es: Enter a new search: Introduce una nueva bรบsqueda Group by items: Agrupar por artรญculos valentinesDay: Dรญa de San Valentรญn mothersDay: Dรญa de la Madre allSaints: Dรญa de Todos los Santos + frenchMothersDay: (Francia) Dรญa de la Madre Campaign consumption: Consumo campaรฑa Campaign: Campaรฑa From: Desde diff --git a/src/pages/Customer/Card/CustomerFiscalData.vue b/src/pages/Customer/Card/CustomerFiscalData.vue index 8f334b11019..93909eb9c75 100644 --- a/src/pages/Customer/Card/CustomerFiscalData.vue +++ b/src/pages/Customer/Card/CustomerFiscalData.vue @@ -2,7 +2,10 @@ import { ref } from 'vue'; import { useI18n } from 'vue-i18n'; import { useRoute } from 'vue-router'; +import { useQuasar } from 'quasar'; +import axios from 'axios'; +import useNotify from 'src/composables/useNotify.js'; import FetchData from 'components/FetchData.vue'; import FormModel from 'components/FormModel.vue'; import VnRow from 'components/ui/VnRow.vue'; @@ -11,9 +14,12 @@ import VnSelect from 'src/components/common/VnSelect.vue'; import VnLocation from 'src/components/common/VnLocation.vue'; import VnCheckbox from 'src/components/common/VnCheckbox.vue'; import { getDifferences, getUpdatedValues } from 'src/filters'; +import VnConfirm from 'src/components/ui/VnConfirm.vue'; +const quasar = useQuasar(); const { t } = useI18n(); const route = useRoute(); +const { notify } = useNotify(); const typesTaxes = ref([]); const typesTransactions = ref([]); @@ -31,6 +37,31 @@ function onBeforeSave(formData, originalData) { formData, ); } + +async function checkEtChanges(data, _, originalData) { + const equalizatedHasChanged = originalData.isEqualizated != data.isEqualizated; + const hasToInvoiceByAddress = + originalData.hasToInvoiceByAddress || data.hasToInvoiceByAddress; + if (equalizatedHasChanged && hasToInvoiceByAddress) { + quasar.dialog({ + component: VnConfirm, + componentProps: { + title: t('You changed the equalization tax'), + message: t('Do you want to spread the change?'), + promise: () => acceptPropagate(data), + }, + }); + } else if (equalizatedHasChanged) { + await acceptPropagate(data); + } +} + +async function acceptPropagate({ isEqualizated }) { + await axios.patch(`Clients/${route.params.id}/addressesPropagateRe`, { + isEqualizated, + }); + notify(t('Equivalent tax spreaded'), 'warning'); +} </script> <template> @@ -45,6 +76,8 @@ function onBeforeSave(formData, originalData) { auto-load model="Customer" :mapper="onBeforeSave" + observe-form-changes + @on-data-saved="checkEtChanges" > <template #form="{ data, validate }"> <VnRow> @@ -180,6 +213,9 @@ es: whenActivatingIt: Al activarlo, no informar el cรณdigo del paรญs en el campo nif inOrderToInvoice: Para facturar no se consulta este campo, sino el RE de consignatario. Al modificar este campo si no esta marcada la casilla Facturar por consignatario, se propagarรก automaticamente el cambio a todos lo consignatarios, en caso contrario preguntarรก al usuario si quiere o no propagar Daily invoice: Facturaciรณn diaria + Equivalent tax spreaded: Recargo de equivalencia propagado + You changed the equalization tax: Has cambiado el recargo de equivalencia + Do you want to spread the change?: ยฟDeseas propagar el cambio a sus consignatarios? en: onlyLetters: Only letters, numbers and spaces can be used whenActivatingIt: When activating it, do not enter the country code in the ID field diff --git a/src/pages/Customer/Card/CustomerSummary.vue b/src/pages/Customer/Card/CustomerSummary.vue index d2eb125d724..324da0771aa 100644 --- a/src/pages/Customer/Card/CustomerSummary.vue +++ b/src/pages/Customer/Card/CustomerSummary.vue @@ -270,7 +270,7 @@ const sumRisk = ({ clientRisks }) => { <VnTitle target="_blank" :url="`${grafanaUrl}/d/40buzE4Vk/comportamiento-pagos-clientes?orgId=1&var-clientFk=${entityId}`" - :text="t('customer.summary.payMethodFk')" + :text="t('customer.summary.financialData')" icon="vn:grafana" /> <VnLv diff --git a/src/pages/Customer/Notifications/CustomerNotificationsCampaignConsumption.vue b/src/pages/Customer/Notifications/CustomerNotificationsCampaignConsumption.vue index 6952379ca53..f637c7e0a6a 100644 --- a/src/pages/Customer/Notifications/CustomerNotificationsCampaignConsumption.vue +++ b/src/pages/Customer/Notifications/CustomerNotificationsCampaignConsumption.vue @@ -87,7 +87,7 @@ onMounted(async () => { <FetchData url="Campaigns/latest" @on-fetch="(data) => (campaignsOptions = data)" - :filter="{ fields: ['id', 'code', 'dated'], order: 'code ASC', limit: 30 }" + :filter="{ fields: ['id', 'code', 'dated'], order: 'code ASC' }" auto-load /> <FetchData diff --git a/src/pages/Customer/components/CustomerAddressCreate.vue b/src/pages/Customer/components/CustomerAddressCreate.vue index 32b4078db88..e1be6b1504c 100644 --- a/src/pages/Customer/components/CustomerAddressCreate.vue +++ b/src/pages/Customer/components/CustomerAddressCreate.vue @@ -98,7 +98,6 @@ function onAgentCreated({ id, fiscalName }, data) { :rules="validate('Worker.postcode')" :acls="[{ model: 'Town', props: '*', accessType: 'WRITE' }]" v-model="data.location" - :required="true" @update:model-value="(location) => handleLocation(data, location)" /> diff --git a/src/pages/Customer/components/CustomerAddressEdit.vue b/src/pages/Customer/components/CustomerAddressEdit.vue index 5b36650f7ea..f852c160ac2 100644 --- a/src/pages/Customer/components/CustomerAddressEdit.vue +++ b/src/pages/Customer/components/CustomerAddressEdit.vue @@ -96,11 +96,11 @@ const updateObservations = async (payload) => { await axios.post('AddressObservations/crud', payload); notes.value = []; deletes.value = []; - toCustomerAddress(); }; async function updateAll({ data, payload }) { await updateObservations(payload); await updateAddress(data); + toCustomerAddress(); } function getPayload() { return { @@ -137,15 +137,12 @@ async function handleDialog(data) { .onOk(async () => { await updateAddressTicket(); await updateAll(body); - toCustomerAddress(); }) .onCancel(async () => { await updateAll(body); - toCustomerAddress(); }); } else { - updateAll(body); - toCustomerAddress(); + await updateAll(body); } } @@ -236,7 +233,7 @@ function handleLocation(data, location) { postcode: data.postalCode, city: data.city, province: data.province, - country: data.province.country, + country: data.province?.country, }" @update:model-value="(location) => handleLocation(data, location)" ></VnLocation> diff --git a/src/pages/Customer/components/CustomerNewPayment.vue b/src/pages/Customer/components/CustomerNewPayment.vue index 7f45cd7db6a..8f61bac89ec 100644 --- a/src/pages/Customer/components/CustomerNewPayment.vue +++ b/src/pages/Customer/components/CustomerNewPayment.vue @@ -114,7 +114,7 @@ function onBeforeSave(data) { if (isCash.value && shouldSendEmail.value && !data.email) return notify(t('There is no assigned email for this client'), 'negative'); - data.bankFk = data.bankFk.id; + data.bankFk = data.bankFk?.id; return data; } @@ -189,7 +189,7 @@ async function getAmountPaid() { :url-create="urlCreate" :mapper="onBeforeSave" @on-data-saved="onDataSaved" - :prevent-submit="true" + prevent-submit > <template #form="{ data, validate }"> <span ref="closeButton" class="row justify-end close-icon" v-close-popup> diff --git a/src/pages/Entry/Card/EntryBuys.vue b/src/pages/Entry/Card/EntryBuys.vue index e159c53569a..81578c609e1 100644 --- a/src/pages/Entry/Card/EntryBuys.vue +++ b/src/pages/Entry/Card/EntryBuys.vue @@ -16,7 +16,6 @@ import ItemDescriptor from 'src/pages/Item/Card/ItemDescriptor.vue'; import axios from 'axios'; import VnSelectEnum from 'src/components/common/VnSelectEnum.vue'; import { checkEntryLock } from 'src/composables/checkEntryLock'; -import SkeletonDescriptor from 'src/components/ui/SkeletonDescriptor.vue'; const $props = defineProps({ id: { @@ -103,7 +102,7 @@ const columns = [ name: 'itemFk', component: 'number', isEditable: false, - width: '40px', + width: '35px', }, { labelAbbreviation: '', @@ -111,7 +110,7 @@ const columns = [ name: 'hex', columnSearch: false, isEditable: false, - width: '5px', + width: '9px', component: 'select', attrs: { url: 'Inks', @@ -181,6 +180,7 @@ const columns = [ url: 'packagings', fields: ['id'], optionLabel: 'id', + optionValue: 'id', }, create: true, width: '40px', @@ -192,7 +192,7 @@ const columns = [ component: 'number', create: true, width: '35px', - format: (row, dashIfEmpty) => parseFloat(row['weight']).toFixed(1), + format: (row) => parseFloat(row['weight']).toFixed(1), }, { labelAbbreviation: 'P', @@ -209,13 +209,14 @@ const columns = [ row['amount'] = row['quantity'] * row['buyingValue']; }, }, - width: '20px', + width: '30px', style: (row) => { if (row.groupingMode === 'grouping') return { color: 'var(--vn-label-color)' }; }, }, { + align: 'center', labelAbbreviation: 'GM', label: t('Grouping selector'), toolTip: t('Grouping selector'), @@ -249,7 +250,7 @@ const columns = [ toolTip: 'Grouping', name: 'grouping', component: 'number', - width: '20px', + width: '30px', create: true, style: (row) => { if (row.groupingMode === 'packing') return { color: 'var(--vn-label-color)' }; @@ -329,6 +330,25 @@ const columns = [ create: true, format: (row) => parseFloat(row['price3']).toFixed(2), }, + { + align: 'center', + labelAbbreviation: 'CM', + label: t('Check min price'), + toolTip: t('Check min price'), + name: 'hasMinPrice', + attrs: { + toggleIndeterminate: false, + }, + component: 'checkbox', + cellEvent: { + 'update:modelValue': async (value, oldValue, row) => { + await axios.patch(`Items/${row['itemFk']}`, { + hasMinPrice: value, + }); + }, + }, + width: '25px', + }, { align: 'center', labelAbbreviation: 'Min.', @@ -349,25 +369,6 @@ const columns = [ }, format: (row) => parseFloat(row['minPrice']).toFixed(2), }, - { - align: 'center', - labelAbbreviation: 'CM', - label: t('Check min price'), - toolTip: t('Check min price'), - name: 'hasMinPrice', - attrs: { - toggleIndeterminate: false, - }, - component: 'checkbox', - cellEvent: { - 'update:modelValue': async (value, oldValue, row) => { - await axios.patch(`Items/${row['itemFk']}`, { - hasMinPrice: value, - }); - }, - }, - width: '25px', - }, { align: 'center', labelAbbreviation: t('P.Sen'), @@ -377,6 +378,9 @@ const columns = [ component: 'number', isEditable: false, width: '40px', + style: () => { + return { color: 'var(--vn-label-color)' }; + }, }, { align: 'center', @@ -416,6 +420,9 @@ const columns = [ component: 'input', isEditable: false, width: '35px', + style: () => { + return { color: 'var(--vn-label-color)' }; + }, }, ]; @@ -508,7 +515,7 @@ async function setBuyUltimate(itemFk, data) { allowedKeys.forEach((key) => { if (buyUltimateData.hasOwnProperty(key) && key !== 'entryFk') { - data[key] = buyUltimateData[key]; + if (!['stickers', 'quantity'].includes(key)) data[key] = buyUltimateData[key]; } }); } @@ -600,7 +607,6 @@ onMounted(() => { ref="entryBuysRef" data-key="EntryBuys" :url="`Entries/${entityId}/getBuyList`" - order="name DESC" save-url="Buys/crud" :disable-option="{ card: true }" v-model:selected="selectedRows" @@ -644,7 +650,8 @@ onMounted(() => { :is-editable="editableMode" :without-header="!editableMode" :with-filters="editableMode" - :right-search="editableMode" + :right-search="true" + :right-search-icon="true" :row-click="false" :columns="columns" :beforeSaveFn="beforeSave" diff --git a/src/pages/Entry/EntryLatestBuysFilter.vue b/src/pages/Entry/EntryLatestBuysFilter.vue index 235f29dfbc2..658ba3847da 100644 --- a/src/pages/Entry/EntryLatestBuysFilter.vue +++ b/src/pages/Entry/EntryLatestBuysFilter.vue @@ -1,8 +1,6 @@ <script setup> import { ref } from 'vue'; import { useI18n } from 'vue-i18n'; - -import FetchData from 'components/FetchData.vue'; import VnInputDate from 'src/components/common/VnInputDate.vue'; import VnInput from 'components/common/VnInput.vue'; import VnSelect from 'components/common/VnSelect.vue'; @@ -18,18 +16,10 @@ defineProps({ }, }); -const itemTypeWorkersOptions = ref([]); const tagValues = ref([]); </script> <template> - <FetchData - url="TicketRequests/getItemTypeWorker" - limit="30" - auto-load - :filter="{ fields: ['id', 'nickname'], order: 'nickname ASC', limit: 30 }" - @on-fetch="(data) => (itemTypeWorkersOptions = data)" - /> <ItemsFilterPanel :data-key="dataKey" :custom-tags="['tags']"> <template #body="{ params, searchFn }"> <QItem class="q-my-md"> @@ -37,9 +27,10 @@ const tagValues = ref([]); <VnSelect :label="t('components.itemsFilterPanel.salesPersonFk')" v-model="params.salesPersonFk" - :options="itemTypeWorkersOptions" - option-value="id" + url="TicketRequests/getItemTypeWorker" option-label="nickname" + :fields="['id', 'nickname']" + sort-by="nickname ASC" dense outlined rounded @@ -52,8 +43,9 @@ const tagValues = ref([]); <QItemSection> <VnSelectSupplier v-model="params.supplierFk" - @update:model-value="searchFn()" - hide-selected + url="Suppliers" + :fields="['id', 'name', 'nickname']" + sort-by="name ASC" dense outlined rounded diff --git a/src/pages/Entry/EntryList.vue b/src/pages/Entry/EntryList.vue index 845d6560457..3c96a230286 100644 --- a/src/pages/Entry/EntryList.vue +++ b/src/pages/Entry/EntryList.vue @@ -44,28 +44,32 @@ const entryQueryFilter = { const columns = computed(() => [ { - label: 'Ex', + labelAbbreviation: 'Ex', + label: t('entry.list.tableVisibleColumns.isExcludedFromAvailable'), toolTip: t('entry.list.tableVisibleColumns.isExcludedFromAvailable'), name: 'isExcludedFromAvailable', component: 'checkbox', width: '35px', }, { - label: 'Pe', + labelAbbreviation: 'Pe', + label: t('entry.list.tableVisibleColumns.isOrdered'), toolTip: t('entry.list.tableVisibleColumns.isOrdered'), name: 'isOrdered', component: 'checkbox', width: '35px', }, { - label: 'Le', + labelAbbreviation: 'LE', + label: t('entry.list.tableVisibleColumns.isConfirmed'), toolTip: t('entry.list.tableVisibleColumns.isConfirmed'), name: 'isConfirmed', component: 'checkbox', width: '35px', }, { - label: 'Re', + labelAbbreviation: 'Re', + label: t('entry.list.tableVisibleColumns.isReceived'), toolTip: t('entry.list.tableVisibleColumns.isReceived'), name: 'isReceived', component: 'checkbox', @@ -89,6 +93,7 @@ const columns = computed(() => [ chip: { condition: () => true, }, + width: '50px', }, { label: t('entry.list.tableVisibleColumns.supplierFk'), @@ -99,8 +104,10 @@ const columns = computed(() => [ attrs: { url: 'suppliers', fields: ['id', 'name'], + where: { order: 'name DESC' }, }, format: (row, dashIfEmpty) => dashIfEmpty(row.supplierName), + width: '110px', }, { align: 'left', @@ -124,6 +131,7 @@ const columns = computed(() => [ label: 'AWB', name: 'awbCode', component: 'input', + width: '100px', }, { align: 'left', @@ -160,6 +168,7 @@ const columns = computed(() => [ component: null, }, format: (row, dashIfEmpty) => dashIfEmpty(row.warehouseOutName), + width: '65px', }, { align: 'left', @@ -175,12 +184,23 @@ const columns = computed(() => [ component: null, }, format: (row, dashIfEmpty) => dashIfEmpty(row.warehouseInName), + width: '65px', }, { align: 'left', + labelAbbreviation: t('Type'), label: t('entry.list.tableVisibleColumns.entryTypeDescription'), + toolTip: t('entry.list.tableVisibleColumns.entryTypeDescription'), name: 'entryTypeCode', - cardVisible: true, + component: 'select', + attrs: { + url: 'entryTypes', + fields: ['code', 'description'], + optionValue: 'code', + optionLabel: 'description', + }, + width: '65px', + format: (row, dashIfEmpty) => dashIfEmpty(row.entryTypeDescription), }, { name: 'companyFk', @@ -320,4 +340,5 @@ es: Search entries: Buscar entradas You can search by entry reference: Puedes buscar por referencia de la entrada Create entry: Crear entrada + Type: Tipo </i18n> diff --git a/src/pages/Entry/EntryStockBought.vue b/src/pages/Entry/EntryStockBought.vue index fa0bdc12e2f..4bd0fe6408d 100644 --- a/src/pages/Entry/EntryStockBought.vue +++ b/src/pages/Entry/EntryStockBought.vue @@ -34,18 +34,20 @@ const columns = computed(() => [ label: t('entryStockBought.buyer'), isTitle: true, component: 'select', + isEditable: false, cardVisible: true, create: true, attrs: { url: 'Workers/activeWithInheritedRole', - fields: ['id', 'name'], + fields: ['id', 'name', 'nickname'], where: { role: 'buyer' }, optionFilter: 'firstName', - optionLabel: 'name', + optionLabel: 'nickname', optionValue: 'id', useLike: false, }, columnFilter: false, + width: '70px', }, { align: 'center', @@ -55,6 +57,7 @@ const columns = computed(() => [ create: true, component: 'number', summation: true, + width: '50px', }, { align: 'center', @@ -78,6 +81,7 @@ const columns = computed(() => [ actions: [ { title: t('entryStockBought.viewMoreDetails'), + name: 'searchBtn', icon: 'search', isPrimary: true, action: (row) => { @@ -91,6 +95,7 @@ const columns = computed(() => [ }, }, ], + 'data-cy': 'table-actions', }, ]); @@ -158,7 +163,7 @@ function round(value) { @on-fetch=" (data) => { travel = data.find( - (data) => data.warehouseIn?.code.toLowerCase() === 'vnh' + (data) => data.warehouseIn?.code.toLowerCase() === 'vnh', ); } " @@ -179,6 +184,7 @@ function round(value) { @click="openDialog()" :title="t('entryStockBought.editTravel')" color="primary" + data-cy="edit-travel" /> </div> </VnRow> @@ -239,10 +245,11 @@ function round(value) { table-height="80vh" auto-load :column-search="false" + :without-header="true" > <template #column-workerFk="{ row }"> <span class="link" @click.stop> - {{ row?.worker?.user?.name }} + {{ row?.worker?.user?.nickname }} <WorkerDescriptorProxy :id="row?.workerFk" /> </span> </template> @@ -279,10 +286,11 @@ function round(value) { justify-content: center; } .column { + min-width: 40%; + margin-top: 5%; display: flex; flex-direction: column; align-items: center; - min-width: 35%; } .text-negative { color: $negative !important; diff --git a/src/pages/Entry/EntryStockBoughtDetail.vue b/src/pages/Entry/EntryStockBoughtDetail.vue index 81217182575..1a37994d908 100644 --- a/src/pages/Entry/EntryStockBoughtDetail.vue +++ b/src/pages/Entry/EntryStockBoughtDetail.vue @@ -21,7 +21,7 @@ const $props = defineProps({ const customUrl = `StockBoughts/getStockBoughtDetail?workerFk=${$props.workerFk}&dated=${$props.dated}`; const columns = [ { - align: 'left', + align: 'right', label: t('Entry'), name: 'entryFk', isTitle: true, @@ -29,7 +29,7 @@ const columns = [ columnFilter: false, }, { - align: 'left', + align: 'right', name: 'itemFk', label: t('Item'), columnFilter: false, @@ -44,21 +44,21 @@ const columns = [ cardVisible: true, }, { - align: 'left', + align: 'right', name: 'volume', label: t('Volume'), columnFilter: false, cardVisible: true, }, { - align: 'left', + align: 'right', label: t('Packaging'), name: 'packagingFk', columnFilter: false, cardVisible: true, }, { - align: 'left', + align: 'right', label: 'Packing', name: 'packing', columnFilter: false, @@ -73,12 +73,14 @@ const columns = [ ref="tableRef" data-key="StockBoughtsDetail" :url="customUrl" - order="itemName DESC" + order="volume DESC" :columns="columns" :right-search="false" :disable-infinite-scroll="true" :disable-option="{ card: true }" :limit="0" + :without-header="true" + :with-filters="false" auto-load > <template #column-entryFk="{ row }"> @@ -99,16 +101,14 @@ const columns = [ </template> <style lang="css" scoped> .container { - max-width: 50vw; + max-width: 100%; + width: 50%; overflow: auto; justify-content: center; align-items: center; margin: auto; background-color: var(--vn-section-color); - padding: 4px; -} -.container > div > div > .q-table__top.relative-position.row.items-center { - background-color: red !important; + padding: 2%; } </style> <i18n> diff --git a/src/pages/InvoiceIn/Card/InvoiceInDueDay.vue b/src/pages/InvoiceIn/Card/InvoiceInDueDay.vue index 1cad40e0b3f..20cc1cc719b 100644 --- a/src/pages/InvoiceIn/Card/InvoiceInDueDay.vue +++ b/src/pages/InvoiceIn/Card/InvoiceInDueDay.vue @@ -7,7 +7,6 @@ import { toDate } from 'src/filters'; import { useArrayData } from 'src/composables/useArrayData'; import { getTotal } from 'src/composables/getTotal'; import CrudModel from 'src/components/CrudModel.vue'; -import FetchData from 'src/components/FetchData.vue'; import VnSelect from 'src/components/common/VnSelect.vue'; import useNotify from 'src/composables/useNotify.js'; import VnInputDate from 'src/components/common/VnInputDate.vue'; @@ -22,7 +21,6 @@ const invoiceIn = computed(() => arrayData.store.data); const currency = computed(() => invoiceIn.value?.currency?.code); const rowsSelected = ref([]); -const banks = ref([]); const invoiceInFormRef = ref(); const invoiceId = +route.params.id; const filter = { where: { invoiceInFk: invoiceId } }; @@ -41,10 +39,9 @@ const columns = computed(() => [ name: 'bank', label: t('Bank'), field: (row) => row.bankFk, - options: banks.value, model: 'bankFk', - optionValue: 'id', optionLabel: 'bank', + url: 'Accountings', sortable: true, tabIndex: 2, align: 'left', @@ -82,12 +79,6 @@ onBeforeMount(async () => { }); </script> <template> - <FetchData - url="Accountings" - auto-load - limit="30" - @on-fetch="(data) => (banks = data)" - /> <CrudModel v-if="invoiceIn" ref="invoiceInFormRef" @@ -117,9 +108,9 @@ onBeforeMount(async () => { <QTd> <VnSelect v-model="row[col.model]" - :options="col.options" - :option-value="col.optionValue" + :url="col.url" :option-label="col.optionLabel" + :option-value="col.optionValue" > <template #option="scope"> <QItem v-bind="scope.itemProps"> @@ -193,8 +184,7 @@ onBeforeMount(async () => { :label="t('Bank')" class="full-width" v-model="props.row['bankFk']" - :options="banks" - option-value="id" + url="Accountings" option-label="bank" > <template #option="scope"> diff --git a/src/pages/InvoiceOut/Card/InvoiceOutDescriptorMenu.vue b/src/pages/InvoiceOut/Card/InvoiceOutDescriptorMenu.vue index eb72563e13b..8be92813426 100644 --- a/src/pages/InvoiceOut/Card/InvoiceOutDescriptorMenu.vue +++ b/src/pages/InvoiceOut/Card/InvoiceOutDescriptorMenu.vue @@ -103,7 +103,7 @@ const refundInvoice = async (withWarehouse) => { t('refundInvoiceSuccessMessage', { refundTicket: data[0].id, }), - 'positive' + 'positive', ); }; @@ -124,6 +124,13 @@ const showRefundInvoiceForm = () => { }, }); }; + +const showExportationLetter = () => { + openReport(`InvoiceOuts/${$props.invoiceOutData.ref}/exportation-pdf`, { + recipientId: $props.invoiceOutData.client.id, + refFk: $props.invoiceOutData.ref, + }); +}; </script> <template> @@ -156,10 +163,14 @@ const showRefundInvoiceForm = () => { <QMenu anchor="top end" self="top start"> <QList> <QItem v-ripple clickable @click="showSendInvoiceDialog('pdf')"> - <QItemSection>{{ t('Send PDF') }}</QItemSection> + <QItemSection data-cy="InvoiceOutDescriptorMenuSendPdfOption"> + {{ t('Send PDF') }} + </QItemSection> </QItem> <QItem v-ripple clickable @click="showSendInvoiceDialog('csv')"> - <QItemSection>{{ t('Send CSV') }}</QItemSection> + <QItemSection data-cy="InvoiceOutDescriptorMenuSendCsvOption"> + {{ t('Send CSV') }} + </QItemSection> </QItem> </QList> </QMenu> @@ -172,7 +183,7 @@ const showRefundInvoiceForm = () => { t('Confirm deletion'), t('Are you sure you want to delete this invoice?'), deleteInvoice, - redirectToInvoiceOutList + redirectToInvoiceOutList, ) " > @@ -185,7 +196,7 @@ const showRefundInvoiceForm = () => { openConfirmationModal( '', t('Are you sure you want to book this invoice?'), - bookInvoice + bookInvoice, ) " > @@ -198,7 +209,7 @@ const showRefundInvoiceForm = () => { openConfirmationModal( t('Generate PDF invoice document'), t('Are you sure you want to generate/regenerate the PDF invoice?'), - generateInvoicePdf + generateInvoicePdf, ) " > @@ -226,6 +237,14 @@ const showRefundInvoiceForm = () => { {{ t('Create a single ticket with all the content of the current invoice') }} </QTooltip> </QItem> + <QItem + v-if="$props.invoiceOutData.serial === 'E'" + v-ripple + clickable + @click="showExportationLetter()" + > + <QItemSection>{{ t('Show CITES letter') }}</QItemSection> + </QItem> </template> <i18n> @@ -255,7 +274,7 @@ es: Create a single ticket with all the content of the current invoice: Crear un ticket รบnico con todo el contenido de la factura actual refundInvoiceSuccessMessage: Se ha creado el siguiente ticket de abono {refundTicket} The email can't be empty: El email no puede estar vacรญo - + Show CITES letter: Ver carta CITES en: refundInvoiceSuccessMessage: The following refund ticket have been created {refundTicket} </i18n> diff --git a/src/pages/InvoiceOut/Card/InvoiceOutSummary.vue b/src/pages/InvoiceOut/Card/InvoiceOutSummary.vue index 3ceb447dd23..161f2ab4589 100644 --- a/src/pages/InvoiceOut/Card/InvoiceOutSummary.vue +++ b/src/pages/InvoiceOut/Card/InvoiceOutSummary.vue @@ -125,7 +125,7 @@ const ticketsColumns = ref([ :value="toDate(invoiceOut.issued)" /> <VnLv - :label="t('invoiceOut.summary.dued')" + :label="t('invoiceOut.summary.expirationDate')" :value="toDate(invoiceOut.dued)" /> <VnLv :label="t('globals.created')" :value="toDate(invoiceOut.created)" /> diff --git a/src/pages/InvoiceOut/InvoiceOutFilter.vue b/src/pages/InvoiceOut/InvoiceOutFilter.vue index cdc9f037ab9..648b8e4e6b9 100644 --- a/src/pages/InvoiceOut/InvoiceOutFilter.vue +++ b/src/pages/InvoiceOut/InvoiceOutFilter.vue @@ -22,7 +22,7 @@ const states = ref(); <VnFilterPanel :data-key="props.dataKey" :search-button="true"> <template #tags="{ tag, formatFn }"> <div class="q-gutter-x-xs"> - <strong>{{ t(`params.${tag.label}`) }}: </strong> + <strong>{{ t(`invoiceOut.params.${tag.label}`) }}: </strong> <span>{{ formatFn(tag.value) }}</span> </div> </template> @@ -84,15 +84,6 @@ const states = ref(); /> </QItemSection> </QItem> - <QItem> - <QItemSection> - <VnInputDate - v-model="params.issued" - :label="t('Issued')" - is-outlined - /> - </QItemSection> - </QItem> <QItem> <QItemSection> <VnInputDate @@ -110,37 +101,3 @@ const states = ref(); </template> </VnFilterPanel> </template> - -<i18n> -en: - params: - search: Contains - clientFk: Customer - fi: FI - amount: Amount - min: Min - max: Max - hasPdf: Has PDF - issued: Issued - created: Created - dued: Dued -es: - params: - search: Contiene - clientFk: Cliente - fi: CIF - amount: Importe - min: Min - max: Max - hasPdf: Tiene PDF - issued: Emitida - created: Creada - dued: Vencida - Customer ID: ID cliente - FI: CIF - Amount: Importe - Has PDF: Tiene PDF - Issued: Fecha emisiรณn - Created: Fecha creaciรณn - Dued: Fecha vencimiento -</i18n> diff --git a/src/pages/InvoiceOut/InvoiceOutList.vue b/src/pages/InvoiceOut/InvoiceOutList.vue index c7d7ba9f45a..873ab030f97 100644 --- a/src/pages/InvoiceOut/InvoiceOutList.vue +++ b/src/pages/InvoiceOut/InvoiceOutList.vue @@ -71,14 +71,6 @@ const columns = computed(() => [ inWhere: true, }, }, - { - align: 'left', - name: 'issued', - label: t('invoiceOut.summary.issued'), - component: 'date', - format: (row) => toDate(row.issued), - columnField: { component: null }, - }, { align: 'left', name: 'clientFk', diff --git a/src/pages/InvoiceOut/InvoiceOutNegativeBases.vue b/src/pages/InvoiceOut/InvoiceOutNegativeBases.vue index 135eb9aca46..b062678a097 100644 --- a/src/pages/InvoiceOut/InvoiceOutNegativeBases.vue +++ b/src/pages/InvoiceOut/InvoiceOutNegativeBases.vue @@ -10,6 +10,8 @@ import CustomerDescriptorProxy from '../Customer/Card/CustomerDescriptorProxy.vu import TicketDescriptorProxy from '../Ticket/Card/TicketDescriptorProxy.vue'; import WorkerDescriptorProxy from '../Worker/Card/WorkerDescriptorProxy.vue'; import VnInputDate from 'components/common/VnInputDate.vue'; +import InvoiceOutNegativeBasesFilter from './InvoiceOutNegativeBasesFilter.vue'; +import RightMenu from 'src/components/common/RightMenu.vue'; const { t } = useI18n(); const tableRef = ref(); @@ -97,16 +99,19 @@ const columns = computed(() => [ align: 'left', name: 'isActive', label: t('invoiceOut.negativeBases.active'), + component: 'checkbox', }, { align: 'left', name: 'hasToInvoice', label: t('invoiceOut.negativeBases.hasToInvoice'), + component: 'checkbox', }, { align: 'left', - name: 'hasVerifiedData', + name: 'isTaxDataChecked', label: t('invoiceOut.negativeBases.verifiedData'), + component: 'checkbox', }, { align: 'left', @@ -142,7 +147,7 @@ const downloadCSV = async () => { await invoiceOutGlobalStore.getNegativeBasesCsv( userParams.from, userParams.to, - filterParams + filterParams, ); }; </script> @@ -154,6 +159,11 @@ const downloadCSV = async () => { </QBtn> </template> </VnSubToolbar> + <RightMenu> + <template #right-panel> + <InvoiceOutNegativeBasesFilter data-key="negativeFilter" /> + </template> + </RightMenu> <VnTable ref="tableRef" data-key="negativeFilter" @@ -174,6 +184,7 @@ const downloadCSV = async () => { auto-load :is-editable="false" :use-model="true" + :right-search="false" > <template #column-clientId="{ row }"> <span class="link" @click.stop> diff --git a/src/pages/InvoiceOut/InvoiceOutNegativeBasesFilter.vue b/src/pages/InvoiceOut/InvoiceOutNegativeBasesFilter.vue index 6ceec61e4b0..cd9836bb781 100644 --- a/src/pages/InvoiceOut/InvoiceOutNegativeBasesFilter.vue +++ b/src/pages/InvoiceOut/InvoiceOutNegativeBasesFilter.vue @@ -2,9 +2,10 @@ import { useI18n } from 'vue-i18n'; import VnFilterPanel from 'src/components/ui/VnFilterPanel.vue'; -import VnInput from 'src/components/common/VnInput.vue'; import VnInputDate from 'components/common/VnInputDate.vue'; import VnInputNumber from 'src/components/common/VnInputNumber.vue'; +import VnSelect from 'src/components/common/VnSelect.vue'; +import VnSelectWorker from 'src/components/common/VnSelectWorker.vue'; const { t } = useI18n(); const props = defineProps({ @@ -24,11 +25,11 @@ const props = defineProps({ > <template #tags="{ tag, formatFn }"> <div class="q-gutter-x-xs"> - <strong>{{ t(`params.${tag.label}`) }}: </strong> + <strong>{{ t(`invoiceOut.params.${tag.label}`) }}: </strong> <span>{{ formatFn(tag.value) }}</span> </div> </template> - <template #body="{ params }"> + <template #body="{ params, searchFn }"> <QItem> <QItemSection> <VnInputDate @@ -49,38 +50,70 @@ const props = defineProps({ </QItem> <QItem> <QItemSection> - <VnInput - v-model="params.company" + <VnSelect + url="Companies" :label="t('globals.company')" - is-outlined - /> + v-model="params.company" + option-label="code" + option-value="code" + dense + outlined + rounded + @update:model-value="searchFn()" + > + <template #option="scope"> + <QItem v-bind="scope.itemProps"> + <QItemSection> + <QItemLabel> + {{ scope.opt?.code }} + </QItemLabel> + <QItemLabel caption> + {{ `#${scope.opt?.id}` }} + </QItemLabel> + </QItemSection> + </QItem> + </template> + </VnSelect> </QItemSection> </QItem> <QItem> <QItemSection> - <VnInput + <VnSelect + url="Countries" + :label="t('globals.params.countryFk')" v-model="params.country" - :label="t('globals.country')" - is-outlined - /> - </QItemSection> - </QItem> - - <QItem> - <QItemSection> - <VnInput - v-model="params.clientId" - :label="t('invoiceOut.negativeBases.clientId')" - is-outlined - /> + option-label="name" + option-value="name" + outlined + dense + rounded + @update:model-value="searchFn()" + > + <template #option="scope"> + <QItem v-bind="scope.itemProps"> + <QItemSection> + <QItemLabel> + {{ scope.opt?.name }} + </QItemLabel> + <QItemLabel caption> + {{ `#${scope.opt?.id}` }} + </QItemLabel> + </QItemSection> + </QItem> + </template> + </VnSelect> </QItemSection> </QItem> <QItem> <QItemSection> - <VnInput - v-model="params.clientSocialName" + <VnSelect + url="Clients" :label="t('globals.client')" - is-outlined + v-model="params.clientId" + outlined + dense + rounded + @update:model-value="searchFn()" /> </QItemSection> </QItem> @@ -90,15 +123,18 @@ const props = defineProps({ v-model="params.amount" :label="t('globals.amount')" is-outlined + :positive="false" /> </QItemSection> </QItem> <QItem> <QItemSection> - <VnInput - v-model="params.comercialName" + <VnSelectWorker :label="t('invoiceOut.negativeBases.comercial')" + v-model="params.workerName" + option-value="name" is-outlined + @update:model-value="searchFn()" /> </QItemSection> </QItem> diff --git a/src/pages/InvoiceOut/locale/en.yml b/src/pages/InvoiceOut/locale/en.yml index cb0dfdca7e0..f1baef432c0 100644 --- a/src/pages/InvoiceOut/locale/en.yml +++ b/src/pages/InvoiceOut/locale/en.yml @@ -4,7 +4,7 @@ invoiceOut: params: company: Company country: Country - clientId: Client ID + clientId: Client clientSocialName: Client taxableBase: Base ticketFk: Ticket @@ -12,6 +12,19 @@ invoiceOut: hasToInvoice: Has to invoice hasVerifiedData: Verified data workerName: Worker + isTaxDataChecked: Verified data + amount: Amount + clientFk: Client + companyFk: Company + created: Created + dued: Dued + customsAgentFk: Custom Agent + ref: Reference + fi: FI + min: Min + max: Max + hasPdf: Has PDF + search: Contains card: issued: Issued customerCard: Customer card @@ -19,6 +32,7 @@ invoiceOut: summary: issued: Issued dued: Due + expirationDate: Expiration date booked: Booked taxBreakdown: Tax breakdown taxableBase: Taxable base @@ -52,7 +66,7 @@ invoiceOut: active: Active hasToInvoice: Has to Invoice verifiedData: Verified Data - comercial: Commercial + comercial: Sales person errors: downloadCsvFailed: CSV download failed invoiceOutModule: diff --git a/src/pages/InvoiceOut/locale/es.yml b/src/pages/InvoiceOut/locale/es.yml index a35c33c4e3a..afca278716a 100644 --- a/src/pages/InvoiceOut/locale/es.yml +++ b/src/pages/InvoiceOut/locale/es.yml @@ -4,7 +4,7 @@ invoiceOut: params: company: Empresa country: Paรญs - clientId: ID del cliente + clientId: Cliente clientSocialName: Cliente taxableBase: Base ticketFk: Ticket @@ -12,6 +12,19 @@ invoiceOut: hasToInvoice: Debe facturar hasVerifiedData: Datos verificados workerName: Comercial + isTaxDataChecked: Datos comprobados + amount: Importe + clientFk: Cliente + companyFk: Empresa + created: Creada + dued: Vencida + customsAgentFk: Agente aduanas + ref: Referencia + fi: CIF + min: Min + max: Max + hasPdf: Tiene PDF + search: Contiene card: issued: Fecha emisiรณn customerCard: Ficha del cliente @@ -19,6 +32,7 @@ invoiceOut: summary: issued: Fecha dued: Fecha lรญmite + expirationDate: Fecha vencimiento booked: Contabilizada taxBreakdown: Desglose impositivo taxableBase: Base imp. diff --git a/src/pages/Item/ItemFixedPriceFilter.vue b/src/pages/Item/ItemFixedPriceFilter.vue index 531c7e09e94..8d92e245dbb 100644 --- a/src/pages/Item/ItemFixedPriceFilter.vue +++ b/src/pages/Item/ItemFixedPriceFilter.vue @@ -1,8 +1,6 @@ <script setup> -import { ref } from 'vue'; import { useI18n } from 'vue-i18n'; -import FetchData from 'components/FetchData.vue'; import VnInputDate from 'src/components/common/VnInputDate.vue'; import VnSelect from 'components/common/VnSelect.vue'; import ItemsFilterPanel from 'src/components/ItemsFilterPanel.vue'; @@ -16,17 +14,9 @@ const props = defineProps({ }, }); -const itemTypeWorkersOptions = ref([]); </script> <template> - <FetchData - url="TicketRequests/getItemTypeWorker" - limit="30" - auto-load - :filter="{ fields: ['id', 'nickname'], order: 'nickname ASC', limit: 30 }" - @on-fetch="(data) => (itemTypeWorkersOptions = data)" - /> <ItemsFilterPanel :data-key="props.dataKey" :custom-tags="['tags']"> <template #body="{ params, searchFn }"> <QItem class="q-my-md"> @@ -34,14 +24,15 @@ const itemTypeWorkersOptions = ref([]); <VnSelect :label="t('params.buyerFk')" v-model="params.buyerFk" - :options="itemTypeWorkersOptions" - option-value="id" + url="TicketRequests/getItemTypeWorker" + :fields="['id', 'nickname']" option-label="nickname" dense outlined rounded use-input @update:model-value="searchFn()" + sort-by="nickname ASC" /> </QItemSection> </QItem> @@ -50,11 +41,10 @@ const itemTypeWorkersOptions = ref([]); <VnSelect url="Warehouses" auto-load - :filter="{ fields: ['id', 'name'], order: 'name ASC', limit: 30 }" + :fields="['id', 'name']" + sort-by="name ASC" :label="t('params.warehouseFk')" v-model="params.warehouseFk" - option-label="name" - option-value="id" dense outlined rounded diff --git a/src/pages/Item/ItemRequestFilter.vue b/src/pages/Item/ItemRequestFilter.vue index af48f7f5c6b..c2a63ddd9b3 100644 --- a/src/pages/Item/ItemRequestFilter.vue +++ b/src/pages/Item/ItemRequestFilter.vue @@ -8,6 +8,7 @@ import VnInput from 'src/components/common/VnInput.vue'; import FetchData from 'components/FetchData.vue'; import { useArrayData } from 'src/composables/useArrayData'; import VnSelectWorker from 'src/components/common/VnSelectWorker.vue'; +import VnInputDate from 'src/components/common/VnInputDate.vue'; const { t } = useI18n(); const props = defineProps({ @@ -52,7 +53,7 @@ onMounted(async () => { name: key, value, selectedField: { name: key, label: t(`params.${key}`) }, - }) + }), ); } exprBuilder('state', arrayData.store?.userParams?.state); @@ -157,6 +158,32 @@ onMounted(async () => { /> </QItemSection> </QItem> + <QItem> + <QItemSection> + <VnInputDate + v-model="params.from" + :label="t('params.from')" + is-outlined + /> + </QItemSection> + <QItemSection> + <VnInputDate + v-model="params.to" + :label="t('params.to')" + is-outlined + /> + </QItemSection> + </QItem> + <QItem> + <QItemSection> + <VnInput + :label="t('params.daysOnward')" + v-model="params.daysOnward" + lazy-rules + is-outlined + /> + </QItemSection> + </QItem> <QItem> <QItemSection> <VnSelect @@ -175,11 +202,10 @@ onMounted(async () => { </QItem> <QItem> <QItemSection> - <VnInput - :label="t('params.daysOnward')" - v-model="params.daysOnward" - lazy-rules - is-outlined + <QCheckbox + :label="t('params.mine')" + v-model="params.mine" + :toggle-indeterminate="false" /> </QItemSection> </QItem> diff --git a/src/pages/Monitor/Ticket/MonitorTickets.vue b/src/pages/Monitor/Ticket/MonitorTickets.vue index 3b5dccb56fd..2ec862df0c1 100644 --- a/src/pages/Monitor/Ticket/MonitorTickets.vue +++ b/src/pages/Monitor/Ticket/MonitorTickets.vue @@ -61,6 +61,7 @@ function exprBuilder(param, value) { case 'nickname': return { [`t.nickname`]: { like: `%${value}%` } }; case 'zoneFk': + return { 't.zoneFk': value }; case 'department': return { 'd.name': value }; case 'totalWithVat': diff --git a/src/pages/Route/Card/RouteAutonomousFilter.vue b/src/pages/Route/Card/RouteAutonomousFilter.vue index 37745594c43..3be409ec91b 100644 --- a/src/pages/Route/Card/RouteAutonomousFilter.vue +++ b/src/pages/Route/Card/RouteAutonomousFilter.vue @@ -46,7 +46,6 @@ const exprBuilder = (param, value) => { url="AgencyModes" :filter="{ fields: ['id', 'name'] }" sort-by="name ASC" - limit="30" @on-fetch="(data) => (agencyList = data)" auto-load /> @@ -54,7 +53,6 @@ const exprBuilder = (param, value) => { url="Agencies" :filter="{ fields: ['id', 'name'] }" sort-by="name ASC" - limit="30" @on-fetch="(data) => (agencyAgreementList = data)" auto-load /> @@ -120,7 +118,11 @@ const exprBuilder = (param, value) => { <VnSelectSupplier :label="t('Autonomous')" v-model="params.supplierFk" - hide-selected + url="Suppliers" + :fields="['name']" + sort-by="name ASC" + option-value="name" + option-label="name" dense outlined rounded diff --git a/src/pages/Route/Card/RouteDescriptor.vue b/src/pages/Route/Card/RouteDescriptor.vue index 829cce4444f..503cd1941f4 100644 --- a/src/pages/Route/Card/RouteDescriptor.vue +++ b/src/pages/Route/Card/RouteDescriptor.vue @@ -1,11 +1,13 @@ <script setup> -import { computed } from 'vue'; +import { ref, computed, onMounted } from 'vue'; import { useRoute } from 'vue-router'; import CardDescriptor from 'components/ui/CardDescriptor.vue'; import VnLv from 'components/ui/VnLv.vue'; import { dashIfEmpty, toDate } from 'src/filters'; import RouteDescriptorMenu from 'pages/Route/Card/RouteDescriptorMenu.vue'; import filter from './RouteFilter.js'; +import useCardDescription from 'src/composables/useCardDescription'; +import axios from 'axios'; const $props = defineProps({ id: { @@ -16,10 +18,29 @@ const $props = defineProps({ }); const route = useRoute(); - +const zone = ref(); +const zoneId = ref(); const entityId = computed(() => { return $props.id || route.params.id; }); +const getZone = async () => { + const filter = { + where: { routeFk: $props.id ? $props.id : route.params.id }, + }; + const { data } = await axios.get('Tickets/findOne', { + params: { + filter: JSON.stringify(filter), + }, + }); + zoneId.value = data.zoneFk; + const { data: zoneData } = await axios.get(`Zones/${zoneId.value}`); + zone.value = zoneData.name; +}; +const data = ref(useCardDescription()); +const setData = (entity) => (data.value = useCardDescription(entity.code, entity.id)); +onMounted(async () => { + getZone(); +}); </script> <template> <CardDescriptor @@ -30,9 +51,9 @@ const entityId = computed(() => { width="lg-width" > <template #body="{ entity }"> - <VnLv :label="$t('Date')" :value="toDate(entity?.created)" /> + <VnLv :label="$t('Date')" :value="toDate(entity?.dated)" /> <VnLv :label="$t('Agency')" :value="entity?.agencyMode?.name" /> - <VnLv :label="$t('Zone')" :value="entity?.zone?.name" /> + <VnLv :label="$t('Zone')" :value="zone" /> <VnLv :label="$t('Volume')" :value="`${dashIfEmpty(entity?.m3)} / ${dashIfEmpty( diff --git a/src/pages/Route/Card/RouteFilter.js b/src/pages/Route/Card/RouteFilter.js index 16d200c99c3..90ee71bf77c 100644 --- a/src/pages/Route/Card/RouteFilter.js +++ b/src/pages/Route/Card/RouteFilter.js @@ -14,7 +14,6 @@ export default { 'started', 'finished', 'cost', - 'zoneFk', 'isOk', ], include: [ @@ -23,7 +22,6 @@ export default { relation: 'vehicle', scope: { fields: ['id', 'm3'] }, }, - { relation: 'zone', scope: { fields: ['id', 'name'] } }, { relation: 'worker', scope: { diff --git a/src/pages/Route/Card/RouteForm.vue b/src/pages/Route/Card/RouteForm.vue index 30ac54896ef..667204b15ac 100644 --- a/src/pages/Route/Card/RouteForm.vue +++ b/src/pages/Route/Card/RouteForm.vue @@ -28,7 +28,6 @@ const defaultInitialData = { isOk: false, }; const maxDistance = ref(); - const onSave = (data, response) => { if (isNew) { axios.post(`Routes/${response?.id}/updateWorkCenter`); diff --git a/src/pages/Route/Roadmap/RoadmapAddStopForm.vue b/src/pages/Route/Roadmap/RoadmapAddStopForm.vue index 6cc21fd4d09..dd8ad94cb02 100644 --- a/src/pages/Route/Roadmap/RoadmapAddStopForm.vue +++ b/src/pages/Route/Roadmap/RoadmapAddStopForm.vue @@ -48,7 +48,6 @@ const onFetch = (data) => { }, ], }" - limit="30" @on-fetch="onFetch" /> <div :class="[isDialog ? 'column' : 'form-gap', 'full-width flex']"> diff --git a/src/pages/Route/Roadmap/RoadmapBasicData.vue b/src/pages/Route/Roadmap/RoadmapBasicData.vue index 5f8ba3bf544..a9e6059c337 100644 --- a/src/pages/Route/Roadmap/RoadmapBasicData.vue +++ b/src/pages/Route/Roadmap/RoadmapBasicData.vue @@ -18,6 +18,7 @@ const onSave = (data, response) => { <template> <FormModel :update-url="`Roadmaps/${$route.params?.id}`" + :url="`Roadmaps/${$route.params?.id}`" observe-form-changes model="Roadmap" auto-load diff --git a/src/pages/Route/Roadmap/RoadmapFilter.vue b/src/pages/Route/Roadmap/RoadmapFilter.vue index 0d51a88bb2b..982f1efba54 100644 --- a/src/pages/Route/Roadmap/RoadmapFilter.vue +++ b/src/pages/Route/Roadmap/RoadmapFilter.vue @@ -1,7 +1,5 @@ <script setup> -import { ref } from 'vue'; import { useI18n } from 'vue-i18n'; -import FetchData from 'components/FetchData.vue'; import VnFilterPanel from 'components/ui/VnFilterPanel.vue'; import VnInputDate from 'components/common/VnInputDate.vue'; import VnInput from 'components/common/VnInput.vue'; @@ -65,6 +63,7 @@ const emit = defineEmits(['search']); <QItemSection> <VnSelectSupplier :label="t('Carrier')" + :fields="['id', 'nickname']" v-model="params.supplierFk" dense outlined diff --git a/src/pages/Route/RouteExtendedList.vue b/src/pages/Route/RouteExtendedList.vue index 46bc1a69080..a8d8477115e 100644 --- a/src/pages/Route/RouteExtendedList.vue +++ b/src/pages/Route/RouteExtendedList.vue @@ -280,7 +280,7 @@ const openTicketsDialog = (id) => { </QCardSection> <QCardSection class="q-pt-none"> <VnInputDate - :label="t('route.Stating date')" + :label="t('route.Starting date')" v-model="startingDate" autofocus /> @@ -335,6 +335,7 @@ const openTicketsDialog = (id) => { <QBtn icon="vn:clone" color="primary" + flat class="q-mr-sm" :disable="!selectedRows?.length" @click="confirmationDialog = true" @@ -344,6 +345,7 @@ const openTicketsDialog = (id) => { <QBtn icon="cloud_download" color="primary" + flat class="q-mr-sm" :disable="!selectedRows?.length" @click="showRouteReport" @@ -353,6 +355,7 @@ const openTicketsDialog = (id) => { <QBtn icon="check" color="primary" + flat class="q-mr-sm" :disable="!selectedRows?.length" @click="markAsServed()" diff --git a/src/pages/Shelving/Parking/Card/ParkingBasicData.vue b/src/pages/Shelving/Parking/Card/ParkingBasicData.vue index 5c3657691a5..3de35800218 100644 --- a/src/pages/Shelving/Parking/Card/ParkingBasicData.vue +++ b/src/pages/Shelving/Parking/Card/ParkingBasicData.vue @@ -8,6 +8,11 @@ import VnSelect from 'src/components/common/VnSelect.vue'; const sectors = ref([]); const sectorFilter = { fields: ['id', 'description'] }; + +const filter = { + fields: ['sectorFk', 'code', 'pickingOrder'], + include: [{ relation: 'sector', scope: sectorFilter }], +}; </script> <template> <FetchData diff --git a/src/pages/Shelving/Parking/locale/en.yml b/src/pages/Shelving/Parking/locale/en.yml index 72caba4082b..2076f38b439 100644 --- a/src/pages/Shelving/Parking/locale/en.yml +++ b/src/pages/Shelving/Parking/locale/en.yml @@ -1,7 +1,5 @@ parking: pickingOrder: Picking order sector: Sector - row: Row - column: Column search: Search parking searchInfo: You can search by parking code \ No newline at end of file diff --git a/src/pages/Shelving/Parking/locale/es.yml b/src/pages/Shelving/Parking/locale/es.yml index ab23182a138..17fe3af537d 100644 --- a/src/pages/Shelving/Parking/locale/es.yml +++ b/src/pages/Shelving/Parking/locale/es.yml @@ -1,7 +1,5 @@ parking: pickingOrder: Orden de recogida - row: Fila sector: Sector - column: Columna search: Buscar parking searchInfo: Puedes buscar por cรณdigo de parking \ No newline at end of file diff --git a/src/pages/Ticket/Card/TicketEditMana.vue b/src/pages/Ticket/Card/TicketEditMana.vue index 693875712d1..14eec9db93d 100644 --- a/src/pages/Ticket/Card/TicketEditMana.vue +++ b/src/pages/Ticket/Card/TicketEditMana.vue @@ -21,6 +21,10 @@ const $props = defineProps({ type: String, default: 'mana', }, + sale: { + type: Object, + default: null, + }, }); const emit = defineEmits(['save', 'cancel']); @@ -29,8 +33,8 @@ const { t } = useI18n(); const QPopupProxyRef = ref(null); const manaCode = ref($props.manaCode); -const save = () => { - emit('save'); +const save = (sale = $props.sale) => { + emit('save', sale); QPopupProxyRef.value.hide(); }; @@ -38,16 +42,20 @@ const cancel = () => { emit('cancel'); QPopupProxyRef.value.hide(); }; +defineExpose({ save }); </script> <template> - <QPopupProxy ref="QPopupProxyRef"> + <QPopupProxy ref="QPopupProxyRef" data-cy="ticketEditManaProxy"> <div class="container"> <QSpinner v-if="!mana" color="primary" size="md" /> <div v-else> <div class="header">Mana: {{ toCurrency(mana) }}</div> <div class="q-pa-md"> - <slot /> + <slot :popup="QPopupProxyRef" /> + <div v-if="usesMana" class="column q-gutter-y-sm q-mt-sm"> + <VnUsesMana :mana-code="manaCode" /> + </div> <div v-if="newPrice" class="column items-center q-mt-lg"> <span class="text-primary">{{ t('New price') }}</span> <span class="text-subtitle1"> @@ -56,9 +64,6 @@ const cancel = () => { </div> </div> </div> - <div v-if="usesMana" class="column q-gutter-y-sm q-mt-sm"> - <VnUsesMana :mana-code="manaCode" /> - </div> <div class="row"> <QBtn color="primary" diff --git a/src/pages/Ticket/Card/TicketPackage.vue b/src/pages/Ticket/Card/TicketPackage.vue index 8bfb73682ef..5fbf4c80017 100644 --- a/src/pages/Ticket/Card/TicketPackage.vue +++ b/src/pages/Ticket/Card/TicketPackage.vue @@ -49,7 +49,7 @@ watch( <FetchData @on-fetch="(data) => (listPackagingsOptions = data)" auto-load - :filter="{ fields: ['packagingFk', 'name'], order: 'name ASC', limit: 30 }" + :filter="{ fields: ['packagingFk', 'name'], order: 'name ASC' }" url="Packagings/listPackaging" /> <div class="flex justify-center"> diff --git a/src/pages/Ticket/Card/TicketSale.vue b/src/pages/Ticket/Card/TicketSale.vue index 004bcbe7927..e680fb29012 100644 --- a/src/pages/Ticket/Card/TicketSale.vue +++ b/src/pages/Ticket/Card/TicketSale.vue @@ -22,7 +22,6 @@ import { useVnConfirm } from 'composables/useVnConfirm'; import useNotify from 'src/composables/useNotify.js'; import axios from 'axios'; import VnTable from 'src/components/VnTable/VnTable.vue'; -import VnUsesMana from 'src/components/ui/VnUsesMana.vue'; import VnConfirm from 'src/components/ui/VnConfirm.vue'; import TicketProblems from 'src/components/TicketProblems.vue'; import RightMenu from 'src/components/common/RightMenu.vue'; @@ -33,6 +32,7 @@ const { t } = useI18n(); const { notify } = useNotify(); const { openConfirmationModal } = useVnConfirm(); const editPriceProxyRef = ref(null); +const editManaProxyRef = ref(null); const stateBtnDropdownRef = ref(null); const quasar = useQuasar(); const arrayData = useArrayData('Ticket'); @@ -53,7 +53,6 @@ const transfer = ref({ sales: [], }); const tableRef = ref([]); -const canProceed = ref(); watch( () => route.params.id, @@ -133,7 +132,6 @@ const columns = computed(() => [ align: 'left', label: t('globals.amount'), name: 'amount', - format: (row) => parseInt(row.amount * row.quantity), }, { align: 'left', @@ -183,8 +181,6 @@ const resetChanges = async () => { }; const rowToUpdate = ref(null); const changeQuantity = async (sale) => { - canProceed.value = await isSalePrepared(sale); - if (!canProceed.value) return; if ( !sale.itemFk || sale.quantity == null || @@ -193,11 +189,21 @@ const changeQuantity = async (sale) => { return; if (!sale.id) return addSale(sale); + if (await isSalePrepared(sale)) { + await confirmUpdate(() => updateQuantity(sale)); + } else await updateQuantity(sale); +}; + +const updateQuantity = async (sale) => { try { + let { quantity, id } = sale; if (!rowToUpdate.value) return; rowToUpdate.value = null; sale.isNew = false; - await updateQuantity(sale); + const params = { quantity: quantity }; + await axios.post(`Sales/${id}/updateQuantity`, params); + notify('globals.dataSaved', 'positive'); + tableRef.value.reload(); } catch (e) { const { quantity } = tableRef.value.CrudModelRef.originalData.find( (s) => s.id === sale.id, @@ -207,12 +213,6 @@ const changeQuantity = async (sale) => { } }; -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 params = { barcode: sale.itemFk, @@ -237,13 +237,17 @@ const addSale = async (sale) => { sale.isNew = false; arrayData.fetch({}); }; +const changeConcept = async (sale) => { + if (await isSalePrepared(sale)) { + await confirmUpdate(() => updateConcept(sale)); + } else await updateConcept(sale); +}; const updateConcept = async (sale) => { - canProceed.value = await isSalePrepared(sale); - if (!canProceed.value) return; const data = { newConcept: sale.concept }; await axios.post(`Sales/${sale.id}/updateConcept`, data); notify('globals.dataSaved', 'positive'); + tableRef.value.reload(); }; const DEFAULT_EDIT = { @@ -295,33 +299,43 @@ const onOpenEditDiscountPopover = async (sale) => { }; } }; - -const updatePrice = async (sale) => { - canProceed.value = await isSalePrepared(sale); - if (!canProceed.value) return; +const changePrice = async (sale) => { const newPrice = edit.value.price; if (newPrice != null && newPrice != sale.price) { - await axios.post(`Sales/${sale.id}/updatePrice`, { newPrice }); - sale.price = newPrice; - edit.value = { ...DEFAULT_EDIT }; - notify('globals.dataSaved', 'positive'); + if (await isSalePrepared(sale)) { + await confirmUpdate(() => updatePrice(sale, newPrice)); + } else updatePrice(sale, newPrice); } - await getMana(); }; +const updatePrice = async (sale, newPrice) => { + await axios.post(`Sales/${sale.id}/updatePrice`, { newPrice }); + sale.price = newPrice; + edit.value = { ...DEFAULT_EDIT }; + notify('globals.dataSaved', 'positive'); + tableRef.value.reload(); +}; const changeDiscount = async (sale) => { - canProceed.value = await isSalePrepared(sale); - if (!canProceed.value) return; const newDiscount = edit.value.discount; - if (newDiscount != null && newDiscount != sale.discount) updateDiscount([sale]); + if (newDiscount != null && newDiscount != sale.discount) { + if (await isSalePrepared(sale)) + await confirmUpdate(() => updateDiscount([sale], newDiscount)); + else await updateDiscount([sale], newDiscount); + } +}; + +const updateDiscounts = async (sales, newDiscount = null) => { + const salesTracking = await fetchSalesTracking(); + + const someSaleIsPrepared = salesTracking.some((sale) => + matchSale(salesTracking, sale), + ); + if (someSaleIsPrepared) await confirmUpdate(() => updateDiscount(sales, newDiscount)); + else updateDiscount(sales, newDiscount); }; const updateDiscount = async (sales, newDiscount = null) => { - for (const sale of sales) { - const canProceed = await isSalePrepared(sale); - if (!canProceed) return; - } const saleIds = sales.map((sale) => sale.id); const _newDiscount = newDiscount || edit.value.discount; const params = { @@ -331,8 +345,7 @@ const updateDiscount = async (sales, newDiscount = null) => { }; await axios.post(`Tickets/${route.params.id}/updateDiscount`, params); notify('globals.dataSaved', 'positive'); - for (let sale of sales) sale.discount = _newDiscount; - edit.value = { ...DEFAULT_EDIT }; + tableRef.value.reload(); }; const getNewPrice = computed(() => { @@ -425,9 +438,13 @@ onMounted(async () => { const items = ref([]); const newRow = ref({}); +const changeItem = async (sale) => { + if (await isSalePrepared(sale)) { + await confirmUpdate(() => updateItem(sale)); + } else await updateItem(sale); +}; + const updateItem = async (row) => { - canProceed.value = await isSalePrepared(row); - if (!canProceed.value) return; const selectedItem = items.value.find((item) => item.id === row.itemFk); if (selectedItem) { row.item = selectedItem; @@ -471,7 +488,18 @@ const endNewRow = (row) => { } }; -async function isSalePrepared(item) { +async function confirmUpdate(cb) { + await quasar + .dialog({ + component: VnConfirm, + componentProps: { + title: t('Item prepared'), + message: t('This item is already prepared. Do you want to continue?'), + }, + }) + .onOk(cb); +} +async function fetchSalesTracking() { const filter = { params: { where: { ticketFk: route.params.id }, @@ -483,48 +511,37 @@ async function isSalePrepared(item) { filter: JSON.stringify(filter), }, }); - - const matchingSale = data.find((sale) => sale.itemFk === item.itemFk); - if (!matchingSale) { - return true; - } - - if ( - matchingSale.hasSaleGroupDetail || - matchingSale.isControled || - matchingSale.isPrepared || - matchingSale.isPrevious || - matchingSale.isPreviousSelected - ) { - try { - await new Promise((resolve, reject) => { - quasar - .dialog({ - component: VnConfirm, - componentProps: { - title: t('Item prepared'), - message: t( - 'This item is already prepared. Do you want to continue?', - ), - data: item, - }, - }) - .onOk(() => resolve(true)) - .onCancel(() => reject(new Error('cancelled'))); - }); - } catch (error) { - tableRef.value.reload(); - return false; - } - } - return true; + return data; } +async function isSalePrepared(sale) { + const data = await fetchSalesTracking(); + return matchSale(data, sale); +} +function matchSale(data, sale) { + const matchingSale = data.find(({ itemFk }) => itemFk === sale.itemFk); + + if (!matchingSale) { + return false; + } + + return isPrepared(matchingSale); +} +function isPrepared(sale) { + const flagsToCheck = [ + 'hasSaleGroupDetail', + 'isControled', + 'isPrepared', + 'isPrevious', + 'isPreviousSelected', + ]; + return flagsToCheck.some((flag) => sale[flag] === 1); +} watch( () => newRow.value.itemFk, (newItemFk) => { if (newItemFk) { - updateItem(newRow.value); + changeItem(newRow.value); } }, ); @@ -585,7 +602,7 @@ watch( :mana="mana" :ticket-config="ticketConfig" @get-mana="getMana()" - @update-discounts="updateDiscount" + @update-discounts="updateDiscounts" @refresh-table="resetChanges" /> <QBtn @@ -716,7 +733,7 @@ watch( option-value="id" v-model="row.itemFk" :use-like="false" - @update:model-value="updateItem(row)" + @update:model-value="changeItem(row)" > <template #option="scope"> <QItem v-bind="scope.itemProps"> @@ -742,16 +759,21 @@ watch( </div> <FetchedTags :item="row" :max-length="6" /> <QPopupProxy v-if="row.id && isTicketEditable"> - <VnInput v-model="row.concept" @change="updateConcept(row)" /> + <VnInput + v-model="row.concept" + @keyup.enter.stop="changeConcept(row)" + :hint="t('globals.enterToConfirm')" + /> </QPopupProxy> </template> <template #column-quantity="{ row }"> <VnInput + data-cy="ticketSaleQuantityInput" v-if="row.isNew || isTicketEditable" type="number" v-model.number="row.quantity" @blur="changeQuantity(row)" - @keyup.enter="changeQuantity(row)" + @keyup.enter.stop="changeQuantity(row)" @update:model-value="() => (rowToUpdate = row)" @focus="edit.oldQuantity = row.quantity" /> @@ -765,10 +787,12 @@ watch( <TicketEditManaProxy ref="editPriceProxyRef" :mana="mana" + :sale="row" :new-price="getNewPrice" - @save="updatePrice(row)" + @save="changePrice" > <VnInput + @keyup.enter.stop="() => editManaProxyRef.save(row)" v-model.number="edit.price" :label="t('basicData.price')" type="number" @@ -782,27 +806,29 @@ watch( <QBtn flat class="link" dense @click="onOpenEditDiscountPopover(row)"> {{ toPercentage(row.discount / 100) }} </QBtn> + <TicketEditManaProxy + ref="editManaProxyRef" :mana="mana" + :sale="row" :new-price="getNewPrice" :uses-mana="usesMana" :mana-code="manaCode" - @save="changeDiscount(row)" + @save="changeDiscount" > <VnInput + autofocus + @keyup.enter.stop="() => editManaProxyRef.save(row)" v-model.number="edit.discount" :label="t('ticketSale.discount')" type="number" /> - <div v-if="usesMana" class="column q-gutter-y-sm q-mt-sm"> - <VnUsesMana :mana-code="manaCode" /> - </div> </TicketEditManaProxy> </template> <span v-else>{{ toPercentage(row.discount / 100) }}</span> </template> <template #column-amount="{ row }"> - {{ toCurrency(row.quantity * row.price) }} + {{ toCurrency(getSaleTotal(row)) }} </template> </VnTable> diff --git a/src/pages/Ticket/TicketFuture.vue b/src/pages/Ticket/TicketFuture.vue index e8e2dd775b7..92911cd2549 100644 --- a/src/pages/Ticket/TicketFuture.vue +++ b/src/pages/Ticket/TicketFuture.vue @@ -1,24 +1,22 @@ <script setup> -import { onMounted, ref, computed, reactive } from 'vue'; +import { ref, computed, reactive, watch } from 'vue'; import { useI18n } from 'vue-i18n'; -import FetchData from 'components/FetchData.vue'; -import VnInput from 'src/components/common/VnInput.vue'; -import VnSelect from 'src/components/common/VnSelect.vue'; import TicketDescriptorProxy from 'src/pages/Ticket/Card/TicketDescriptorProxy.vue'; import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue'; import VnSearchbar from 'src/components/ui/VnSearchbar.vue'; import RightMenu from 'src/components/common/RightMenu.vue'; +import VnTable from 'src/components/VnTable/VnTable.vue'; import TicketFutureFilter from './TicketFutureFilter.vue'; import { dashIfEmpty, toCurrency } from 'src/filters'; import { useVnConfirm } from 'composables/useVnConfirm'; -import { useArrayData } from 'composables/useArrayData'; import { getDateQBadgeColor } from 'src/composables/getDateQBadgeColor.js'; import useNotify from 'src/composables/useNotify.js'; import { useState } from 'src/composables/useState'; import { toDateTimeFormat } from 'src/filters/date.js'; import axios from 'axios'; +import TicketProblems from 'src/components/TicketProblems.vue'; const state = useState(); const { t } = useI18n(); @@ -26,214 +24,126 @@ const { openConfirmationModal } = useVnConfirm(); const { notify } = useNotify(); const user = state.getUser(); -const itemPackingTypesOptions = ref([]); const selectedTickets = ref([]); - -const exprBuilder = (param, value) => { - switch (param) { - case 'id': - return { id: value }; - case 'futureId': - return { futureId: value }; - case 'liters': - return { liters: value }; - case 'lines': - return { lines: value }; - case 'iptColFilter': - return { ipt: { like: `%${value}%` } }; - case 'futureIptColFilter': - return { futureIpt: { like: `%${value}%` } }; - case 'totalWithVat': - return { totalWithVat: value }; - } -}; - +const vnTableRef = ref({}); +const originElRef = ref(null); +const destinationElRef = ref(null); const userParams = reactive({ futureScopeDays: Date.vnNew().toISOString(), originScopeDays: Date.vnNew().toISOString(), warehouseFk: user.value.warehouseFk, }); -const arrayData = useArrayData('FutureTickets', { - url: 'Tickets/getTicketsFuture', - userParams: userParams, - exprBuilder: exprBuilder, -}); -const { store } = arrayData; - -const params = reactive({ - futureScopeDays: Date.vnNew(), - originScopeDays: Date.vnNew(), - warehouseFk: user.value.warehouseFk, -}); - -const applyColumnFilter = async (col) => { - const paramKey = col.columnFilter?.filterParamKey || col.field; - params[paramKey] = col.columnFilter.filterValue; - await arrayData.addFilter({ params }); -}; - -const getInputEvents = (col) => { - return col.columnFilter.type === 'select' - ? { 'update:modelValue': () => applyColumnFilter(col) } - : { - 'keyup.enter': () => applyColumnFilter(col), - }; -}; - -const tickets = computed(() => store.data); - const ticketColumns = computed(() => [ { - label: t('futureTickets.problems'), + label: '', name: 'problems', + headerClass: 'horizontal-separator', align: 'left', - columnFilter: null, + columnFilter: false, }, { label: t('advanceTickets.ticketId'), - name: 'ticketId', + name: 'id', align: 'center', - sortable: true, - columnFilter: { - component: VnInput, - type: 'text', - filterValue: null, - filterParamKey: 'id', - event: getInputEvents, - attrs: { - dense: true, - }, - }, + headerClass: 'horizontal-separator', }, { label: t('futureTickets.shipped'), name: 'shipped', align: 'left', - sortable: true, - columnFilter: null, + columnFilter: false, + headerClass: 'horizontal-separator', }, { + align: 'center', + class: 'shrink', label: t('advanceTickets.ipt'), name: 'ipt', - field: 'ipt', - align: 'left', - sortable: true, columnFilter: { - component: VnSelect, - filterParamKey: 'iptColFilter', - type: 'select', - filterValue: null, - event: getInputEvents, + component: 'select', attrs: { - options: itemPackingTypesOptions.value, - 'option-value': 'code', - 'option-label': 'description', - dense: true, + url: 'itemPackingTypes', + fields: ['code', 'description'], + where: { isActive: true }, + optionValue: 'code', + optionLabel: 'description', + inWhere: false, }, }, - format: (val) => dashIfEmpty(val), + format: (row, dashIfEmpty) => dashIfEmpty(row.ipt), + headerClass: 'horizontal-separator', }, { label: t('ticketList.state'), name: 'state', align: 'left', - sortable: true, - columnFilter: null, + columnFilter: false, + headerClass: 'horizontal-separator', }, { label: t('advanceTickets.liters'), name: 'liters', - field: 'liters', align: 'left', - sortable: true, - columnFilter: { - component: VnInput, - type: 'text', - filterValue: null, - event: getInputEvents, - attrs: { - dense: true, - }, - }, + headerClass: 'horizontal-separator', }, { label: t('advanceTickets.import'), - field: 'import', name: 'import', align: 'left', - sortable: true, + headerClass: 'horizontal-separator', + columnFilter: false, + format: (row) => toCurrency(row.totalWithVat), }, { label: t('futureTickets.availableLines'), name: 'lines', field: 'lines', align: 'center', - sortable: true, - columnFilter: { - component: VnInput, - type: 'text', - filterValue: null, - event: getInputEvents, - attrs: { - dense: true, - }, - }, - format: (val) => dashIfEmpty(val), + headerClass: 'horizontal-separator', + format: (row, dashIfEmpty) => dashIfEmpty(row.lines), }, { label: t('advanceTickets.futureId'), name: 'futureId', - align: 'left', - sortable: true, - columnFilter: { - component: VnInput, - type: 'text', - filterValue: null, - filterParamKey: 'futureId', - event: getInputEvents, - attrs: { - dense: true, - }, - }, + align: 'center', + headerClass: 'horizontal-separator vertical-separator ', + columnClass: 'vertical-separator', }, { label: t('futureTickets.futureShipped'), name: 'futureShipped', align: 'left', - sortable: true, - columnFilter: null, - format: (val) => dashIfEmpty(val), + headerClass: 'horizontal-separator', + columnFilter: false, + format: (row) => toDateTimeFormat(row.futureShipped), }, - { + align: 'center', label: t('advanceTickets.futureIpt'), + class: 'shrink', name: 'futureIpt', - field: 'futureIpt', - align: 'left', - sortable: true, columnFilter: { - component: VnSelect, - filterParamKey: 'futureIptColFilter', - type: 'select', - filterValue: null, - event: getInputEvents, + component: 'select', attrs: { - options: itemPackingTypesOptions.value, - 'option-value': 'code', - 'option-label': 'description', - dense: true, + url: 'itemPackingTypes', + fields: ['code', 'description'], + where: { isActive: true }, + optionValue: 'code', + optionLabel: 'description', }, }, - format: (val) => dashIfEmpty(val), + headerClass: 'horizontal-separator', + format: (row, dashIfEmpty) => dashIfEmpty(row.futureIpt), }, { label: t('advanceTickets.futureState'), name: 'futureState', align: 'right', - sortable: true, - columnFilter: null, - format: (val) => dashIfEmpty(val), + headerClass: 'horizontal-separator', + class: 'expand', + columnFilter: false, + format: (row, dashIfEmpty) => dashIfEmpty(row.futureState), }, ]); @@ -258,26 +168,51 @@ const moveTicketsFuture = async () => { await axios.post('Tickets/merge', params); notify(t('advanceTickets.moveTicketSuccess'), 'positive'); selectedTickets.value = []; - arrayData.fetch({ append: false }); + vnTableRef.value.reload(); }; -onMounted(async () => { - await arrayData.fetch({ append: false }); -}); + +watch( + () => vnTableRef.value.tableRef?.$el, + ($el) => { + if (!$el) return; + const head = $el.querySelector('thead'); + const firstRow = $el.querySelector('thead > tr'); + + const newRow = document.createElement('tr'); + destinationElRef.value = document.createElement('th'); + originElRef.value = document.createElement('th'); + + newRow.classList.add('bg-header'); + destinationElRef.value.classList.add('text-uppercase', 'color-vn-label'); + originElRef.value.classList.add('text-uppercase', 'color-vn-label'); + + destinationElRef.value.setAttribute('colspan', '7'); + originElRef.value.setAttribute('colspan', '9'); + + originElRef.value.textContent = `${t('advanceTickets.origin')}`; + destinationElRef.value.textContent = `${t('advanceTickets.destination')}`; + + newRow.append(destinationElRef.value, originElRef.value); + head.insertBefore(newRow, firstRow); + }, + { once: true, inmmediate: true }, +); + +watch( + () => vnTableRef.value.params, + () => { + if (originElRef.value && destinationElRef.value) { + destinationElRef.value.textContent = `${t('advanceTickets.origin')}`; + originElRef.value.textContent = `${t('advanceTickets.destination')}`; + } + }, + { deep: true }, +); </script> <template> - <FetchData - url="itemPackingTypes" - :filter="{ - fields: ['code', 'description'], - order: 'description ASC', - where: { isActive: true }, - }" - auto-load - @on-fetch="(data) => (itemPackingTypesOptions = data)" - /> <VnSearchbar - data-key="FutureTickets" + data-key="futureTicket" :label="t('Search ticket')" :info="t('futureTickets.searchInfo')" /> @@ -293,7 +228,7 @@ onMounted(async () => { t(`futureTickets.moveTicketDialogSubtitle`, { selectedTickets: selectedTickets.length, }), - moveTicketsFuture + moveTicketsFuture, ) " > @@ -305,77 +240,29 @@ onMounted(async () => { </VnSubToolbar> <RightMenu> <template #right-panel> - <TicketFutureFilter data-key="FutureTickets" /> + <TicketFutureFilter data-key="futureTickets" /> </template> </RightMenu> <QPage class="column items-center q-pa-md"> - <QTable - :rows="tickets" + <VnTable + data-key="futureTickets" + ref="vnTableRef" + url="Tickets/getTicketsFuture" + search-url="futureTickets" + :user-params="userParams" + :limit="0" :columns="ticketColumns" - row-key="id" - selection="multiple" + :table="{ + 'row-key': '$index', + selection: 'multiple', + }" v-model:selected="selectedTickets" - :pagination="{ rowsPerPage: 0 }" - :no-data-label="t('globals.noResults')" - style="max-width: 99%" + :right-search="false" + auto-load + :disable-option="{ card: true }" > - <template #header="props"> - <QTr> - <QTh class="horizontal-separator" /> - <QTh - class="horizontal-separator text-uppercase color-vn-label" - colspan="8" - translate - > - {{ t('advanceTickets.origin') }} - </QTh> - <QTh - class="horizontal-separator text-uppercase color-vn-label" - colspan="4" - translate - > - {{ t('advanceTickets.destination') }} - </QTh> - </QTr> - <QTr> - <QTh> - <QCheckbox v-model="props.selected" /> - </QTh> - <QTh - v-for="(col, index) in ticketColumns" - :key="index" - :class="{ 'vertical-separator': col.name === 'futureId' }" - > - {{ col.label }} - </QTh> - </QTr> - </template> - <template #top-row="{ cols }"> - <QTr> - <QTd /> - <QTd - v-for="(col, index) in cols" - :key="index" - style="max-width: 100px" - > - <component - :is="col.columnFilter.component" - v-if="col.columnFilter" - v-model="col.columnFilter.filterValue" - v-bind="col.columnFilter.attrs" - v-on="col.columnFilter.event(col)" - dense - /> - </QTd> - </QTr> - </template> - <template #header-cell-availableLines="{ col }"> - <QTh class="vertical-separator"> - {{ col.label }} - </QTh> - </template> - <template #body-cell-problems="{ row }"> - <QTd class="q-gutter-x-xs"> + <template #column-problems="{ row }"> + <span class="q-gutter-x-xs"> <QIcon v-if="row.futureAgencyFk !== row.agencyFk && row.agencyFk" color="primary" @@ -400,164 +287,88 @@ onMounted(async () => { </span> </QTooltip> </QIcon> - <QIcon - v-if="row.isTaxDataChecked === 0" - color="primary" - name="vn:no036" - size="xs" - > - <QTooltip> - {{ t('futureTickets.noVerified') }} - </QTooltip> - </QIcon> - <QIcon - v-if="row.hasTicketRequest" - color="primary" - name="vn:buyrequest" - size="xs" - > - <QTooltip> - {{ t('futureTickets.purchaseRequest') }} - </QTooltip> - </QIcon> - <QIcon - v-if="row.itemShortage" - color="primary" - name="vn:unavailable" - size="xs" - > - <QTooltip> - {{ t('ticketSale.noVisible') }} - </QTooltip> - </QIcon> - <QIcon - v-if="row.isFreezed" - color="primary" - name="vn:frozen" - size="xs" - > - <QTooltip> - {{ t('futureTickets.clientFrozen') }} - </QTooltip> - </QIcon> - <QIcon v-if="row.risk" color="primary" name="vn:risk" size="xs"> - <QTooltip> - {{ t('futureTickets.risk') }}: {{ row.risk }} - </QTooltip> - </QIcon> - <QIcon - v-if="row.hasComponentLack" - color="primary" - name="vn:components" - size="xs" - > - <QTooltip> - {{ t('futureTickets.componentLack') }} - </QTooltip> - </QIcon> - <QIcon - v-if="row.hasRounding" - color="primary" - name="sync_problem" - size="xs" - > - <QTooltip> - {{ t('futureTickets.rounding') }} - </QTooltip> - </QIcon> - </QTd> + <TicketProblems :row /> + </span> </template> - <template #body-cell-ticketId="{ row }"> - <QTd> - <QBtn flat class="link"> - {{ row.id }} - <TicketDescriptorProxy :id="row.id" /> - </QBtn> - </QTd> + <template #column-id="{ row }"> + <QBtn flat class="link" @click.stop dense> + {{ row.id }} + <TicketDescriptorProxy :id="row.id" /> + </QBtn> </template> - <template #body-cell-shipped="{ row }"> - <QTd class="shipped"> - <QBadge - text-color="black" - :color="getDateQBadgeColor(row.shipped)" - class="q-ma-none" - > - {{ toDateTimeFormat(row.shipped) }} - </QBadge> - </QTd> + <template #column-shipped="{ row }"> + <QBadge + text-color="black" + :color="getDateQBadgeColor(row.shipped)" + class="q-ma-none" + > + {{ toDateTimeFormat(row.shipped) }} + </QBadge> </template> - <template #body-cell-state="{ row }"> - <QTd> - <QBadge - text-color="black" - :color="row.classColor" - class="q-ma-none" - dense - > - {{ row.state }} - </QBadge> - </QTd> + <template #column-state="{ row }"> + <QBadge + v-if="row.state" + text-color="black" + :color="row.classColor" + class="q-ma-none" + dense + > + {{ row.state }} + </QBadge> + <span v-else> {{ dashIfEmpty(row.state) }}</span> </template> - <template #body-cell-import="{ row }"> - <QTd> - <QBadge - :text-color=" - totalPriceColor(row.totalWithVat) === 'warning' - ? 'black' - : 'white' - " - :color="totalPriceColor(row.totalWithVat)" - class="q-ma-none" - dense - > - {{ toCurrency(row.totalWithVat || 0) }} - </QBadge> - </QTd> + <template #column-import="{ row }"> + <QBadge + :text-color=" + totalPriceColor(row.totalWithVat) === 'warning' + ? 'black' + : 'white' + " + :color="totalPriceColor(row.totalWithVat)" + class="q-ma-none" + dense + > + {{ toCurrency(row.totalWithVat || 0) }} + </QBadge> </template> - <template #body-cell-futureId="{ row }"> - <QTd class="vertical-separator"> - <QBtn flat class="link" dense> - {{ row.futureId }} - <TicketDescriptorProxy :id="row.futureId" /> - </QBtn> - </QTd> + <template #column-futureId="{ row }"> + <QBtn flat class="link" @click.stop dense> + {{ row.futureId }} + <TicketDescriptorProxy :id="row.futureId" /> + </QBtn> </template> - <template #body-cell-futureShipped="{ row }"> - <QTd class="shipped"> - <QBadge - text-color="black" - :color="getDateQBadgeColor(row.futureShipped)" - class="q-ma-none" - > - {{ toDateTimeFormat(row.futureShipped) }} - </QBadge> - </QTd> + <template #column-futureShipped="{ row }"> + <QBadge + text-color="black" + :color="getDateQBadgeColor(row.futureShipped)" + class="q-ma-none" + > + {{ toDateTimeFormat(row.futureShipped) }} + </QBadge> </template> - <template #body-cell-futureState="{ row }"> - <QTd> - <QBadge - text-color="black" - :color="row.futureClassColor" - class="q-ma-none" - dense - > - {{ row.futureState }} - </QBadge> - </QTd> + <template #column-futureState="{ row }"> + <QBadge + text-color="black" + :color="row.futureClassColor" + class="q-mr-xs" + dense + > + {{ row.futureState }} + </QBadge> </template> - </QTable> + </VnTable> </QPage> </template> <style scoped lang="scss"> -.shipped { - min-width: 132px; -} -.vertical-separator { +:deep(.vertical-separator) { border-left: 4px solid white !important; } -.horizontal-separator { +:deep(.horizontal-separator) { + border-top: 4px solid white !important; +} +:deep(.horizontal-bottom-separator) { border-bottom: 4px solid white !important; } </style> diff --git a/src/pages/Ticket/TicketFutureFilter.vue b/src/pages/Ticket/TicketFutureFilter.vue index d28b0af71e9..64e060a3921 100644 --- a/src/pages/Ticket/TicketFutureFilter.vue +++ b/src/pages/Ticket/TicketFutureFilter.vue @@ -12,7 +12,7 @@ import axios from 'axios'; import { onMounted } from 'vue'; const { t } = useI18n(); -const props = defineProps({ +defineProps({ dataKey: { type: String, required: true, @@ -58,7 +58,7 @@ onMounted(async () => { auto-load /> <VnFilterPanel - :data-key="props.dataKey" + :data-key :un-removable-params="['warehouseFk', 'originScopeDays ', 'futureScopeDays']" > <template #tags="{ tag, formatFn }"> diff --git a/src/pages/Travel/Card/TravelBasicData.vue b/src/pages/Travel/Card/TravelBasicData.vue index 4b9aa28ed06..b1adc812622 100644 --- a/src/pages/Travel/Card/TravelBasicData.vue +++ b/src/pages/Travel/Card/TravelBasicData.vue @@ -9,6 +9,7 @@ import VnRow from 'components/ui/VnRow.vue'; import VnInput from 'src/components/common/VnInput.vue'; import VnSelect from 'src/components/common/VnSelect.vue'; import VnInputDate from 'components/common/VnInputDate.vue'; +import VnInputTime from 'components/common/VnInputTime.vue'; const route = useRoute(); const { t } = useI18n(); @@ -53,7 +54,16 @@ const warehousesOptionsIn = ref([]); <VnInputDate v-model="data.shipped" :label="t('globals.shipped')" /> <VnInputDate v-model="data.landed" :label="t('globals.landed')" /> </VnRow> - + <VnRow> + <VnInputDate + v-model="data.availabled" + :label="t('travel.summary.availabled')" + /> + <VnInputTime + v-model="data.availabled" + :label="t('travel.summary.availabledHour')" + /> + </VnRow> <VnRow> <VnSelect :label="t('globals.warehouseOut')" @@ -101,10 +111,3 @@ const warehousesOptionsIn = ref([]); </template> </FormModel> </template> - -<i18n> -es: - 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: The travel adjusts itself daily to match the number of days set, starting from today. If left blank, it wonโt move -</i18n> diff --git a/src/pages/Travel/Card/TravelFilter.js b/src/pages/Travel/Card/TravelFilter.js index f5f4520fd49..05436834ffb 100644 --- a/src/pages/Travel/Card/TravelFilter.js +++ b/src/pages/Travel/Card/TravelFilter.js @@ -11,6 +11,7 @@ export default { 'agencyModeFk', 'isRaid', 'daysInForward', + 'availabled', ], include: [ { diff --git a/src/pages/Travel/Card/TravelSummary.vue b/src/pages/Travel/Card/TravelSummary.vue index 16d42f10424..9f955261181 100644 --- a/src/pages/Travel/Card/TravelSummary.vue +++ b/src/pages/Travel/Card/TravelSummary.vue @@ -10,6 +10,8 @@ import EntryDescriptorProxy from 'src/pages/Entry/Card/EntryDescriptorProxy.vue' import FetchData from 'src/components/FetchData.vue'; import VnRow from 'components/ui/VnRow.vue'; import { toDate, toCurrency, toCelsius } from 'src/filters'; +import { toDateTimeFormat } from 'src/filters/date.js'; +import { dashIfEmpty } from 'src/filters'; import axios from 'axios'; import TravelDescriptorMenuItems from './TravelDescriptorMenuItems.vue'; @@ -333,6 +335,12 @@ const getLink = (param) => `#/travel/${entityId.value}/${param}`; <VnLv :label="t('globals.reference')" :value="travel.ref" /> <VnLv label="mยณ" :value="travel.m3" /> <VnLv :label="t('globals.totalEntries')" :value="travel.totalEntries" /> + <VnLv + :label="t('travel.summary.availabled')" + :value=" + dashIfEmpty(toDateTimeFormat(travel.availabled)) + " + /> </QCard> <QCard class="full-width"> <VnTitle :text="t('travel.summary.entries')" /> diff --git a/src/pages/Travel/Card/TravelThermographsForm.vue b/src/pages/Travel/Card/TravelThermographsForm.vue index 7aec32972ce..446e5d50627 100644 --- a/src/pages/Travel/Card/TravelThermographsForm.vue +++ b/src/pages/Travel/Card/TravelThermographsForm.vue @@ -209,7 +209,7 @@ const onThermographCreated = async (data) => { }" sort-by="thermographFk ASC" option-label="thermographFk" - option-filter-value="id" + option-filter-value="thermographFk" :disable="viewAction === 'edit'" :tooltip="t('New thermograph')" :roles-allowed-to-create="['logistic']" diff --git a/src/pages/Travel/ExtraCommunity.vue b/src/pages/Travel/ExtraCommunity.vue index dee9d923a01..ac46caa44aa 100644 --- a/src/pages/Travel/ExtraCommunity.vue +++ b/src/pages/Travel/ExtraCommunity.vue @@ -2,6 +2,7 @@ import { onMounted, ref, computed, watch } from 'vue'; import { QBtn } from 'quasar'; import { useI18n } from 'vue-i18n'; +import { useRoute } from 'vue-router'; import SupplierDescriptorProxy from 'src/pages/Supplier/Card/SupplierDescriptorProxy.vue'; import TravelDescriptorProxy from 'src/pages/Travel/Card/TravelDescriptorProxy.vue'; @@ -22,6 +23,8 @@ import VnPopup from 'src/components/common/VnPopup.vue'; const stateStore = useStateStore(); const { t } = useI18n(); const { openReport } = usePrintService(); +const route = useRoute(); +const tableParams = ref(); const shippedFrom = ref(Date.vnNew()); const landedTo = ref(Date.vnNew()); @@ -143,7 +146,7 @@ const columns = computed(() => [ sortable: true, }, { - label: t('globals.pageTitles.supplier'), + label: t('extraCommunity.cargoShip'), field: 'cargoSupplierNickname', name: 'cargoSupplierNickname', align: 'left', @@ -171,7 +174,7 @@ const columns = computed(() => [ ? value.reduce((sum, entry) => { return sum + (entry.invoiceAmount || 0); }, 0) - : 0 + : 0, ), }, { @@ -200,7 +203,7 @@ const columns = computed(() => [ sortable: true, }, { - label: t('kg'), + label: t('extraCommunity.kg'), field: 'kg', name: 'kg', align: 'left', @@ -208,7 +211,7 @@ const columns = computed(() => [ sortable: true, }, { - label: t('physicKg'), + label: t('extraCommunity.physicKg'), field: 'loadedKg', name: 'loadedKg', align: 'left', @@ -232,7 +235,7 @@ const columns = computed(() => [ sortable: true, }, { - label: t('shipped'), + label: t('extraCommunity.shipped'), field: 'shipped', name: 'shipped', align: 'left', @@ -249,7 +252,7 @@ const columns = computed(() => [ sortable: true, }, { - label: t('landed'), + label: t('extraCommunity.landed'), field: 'landed', name: 'landed', align: 'left', @@ -258,7 +261,7 @@ const columns = computed(() => [ format: (value) => toDate(value), }, { - label: t('notes'), + label: t('extraCommunity.notes'), field: '', name: 'notes', align: 'center', @@ -284,7 +287,7 @@ watch( if (!arrayData.store.data) return; onStoreDataChange(); }, - { deep: true, immediate: true } + { deep: true, immediate: true }, ); const openReportPdf = () => { @@ -451,13 +454,24 @@ const getColor = (percentage) => { for (const { value, className } of travelKgPercentages.value) if (percentage > value) return className; }; + +const filteredEntries = (entries) => { + if (!tableParams?.value?.entrySupplierFk) return entries; + return entries?.filter( + (entry) => entry.supplierFk === tableParams?.value?.entrySupplierFk, + ); +}; + +watch(route, () => { + tableParams.value = JSON.parse(route.query.table); +}); </script> <template> <VnSearchbar data-key="ExtraCommunity" :limit="20" - :label="t('searchExtraCommunity')" + :label="t('extraCommunity.searchExtraCommunity')" /> <RightMenu> <template #right-panel> @@ -521,7 +535,7 @@ const getColor = (percentage) => { ? tableColumnComponents[col.name].event( rows[props.rowIndex][col.field], col.field, - props.rowIndex + props.rowIndex, ) : {} " @@ -546,7 +560,7 @@ const getColor = (percentage) => { }, { link: ['id', 'cargoSupplierNickname'].includes( - col.name + col.name, ), }, ]" @@ -564,9 +578,8 @@ const getColor = (percentage) => { </component> </QTd> </QTr> - <QTr - v-for="(entry, index) in props.row.entries" + v-for="(entry, index) in filteredEntries(props.row.entries)" :key="index" :props="props" class="bg-vn-secondary-row cursor-pointer" @@ -598,7 +611,7 @@ const getColor = (percentage) => { name="warning" color="negative" size="md" - :title="t('requiresInspection')" + :title="t('extraCommunity.requiresInspection')" > </QIcon> </QTd> @@ -709,24 +722,3 @@ const getColor = (percentage) => { width: max-content; } </style> -<i18n> -en: - searchExtraCommunity: Search for extra community shipping - kg: BI. KG - physicKg: Phy. KG - shipped: W. shipped - landed: W. landed - requiresInspection: Requires inspection - BIP: Boder Inspection Point - notes: Notes -es: - searchExtraCommunity: Buscar por envรญo extra comunitario - kg: KG Bloq. - physicKg: KG fรญsico - shipped: F. envรญo - landed: F. llegada - notes: Notas - Open as PDF: Abrir como PDF - requiresInspection: Requiere inspecciรณn - BIP: Punto de Inspecciรณn Fronteriza -</i18n> diff --git a/src/pages/Travel/ExtraCommunityFilter.vue b/src/pages/Travel/ExtraCommunityFilter.vue index b22574632fc..29d3423340c 100644 --- a/src/pages/Travel/ExtraCommunityFilter.vue +++ b/src/pages/Travel/ExtraCommunityFilter.vue @@ -79,7 +79,7 @@ warehouses(); <VnFilterPanel :data-key="props.dataKey" :search-button="true"> <template #tags="{ tag, formatFn }"> <div class="q-gutter-x-xs"> - <strong>{{ t(`params.${tag.label}`) }}: </strong> + <strong>{{ t(`extraCommunity.filter.${tag.label}`) }}: </strong> <span>{{ formatFn(tag.value) }}</span> </div> </template> @@ -92,7 +92,7 @@ warehouses(); <QItem> <QItemSection> <VnInput - :label="t('params.reference')" + :label="t('extraCommunity.filter.reference')" v-model="params.reference" is-outlined /> @@ -103,7 +103,7 @@ warehouses(); <QInput v-model="params.totalEntries" type="number" - :label="t('params.totalEntries')" + :label="t('extraCommunity.filter.totalEntries')" dense outlined rounded @@ -133,10 +133,10 @@ warehouses(); <QItem> <QItemSection> <VnSelect - :label="t('params.agencyModeFk')" + :label="t('extraCommunity.filter.agencyModeFk')" v-model="params.agencyModeFk" :options="agenciesOptions" - option-value="agencyFk" + option-value="id" option-label="name" hide-selected dense @@ -148,7 +148,7 @@ warehouses(); <QItem> <QItemSection> <VnInputDate - :label="t('params.shippedFrom')" + :label="t('extraCommunity.filter.shippedFrom')" v-model="params.shippedFrom" @update:model-value="searchFn()" is-outlined @@ -158,7 +158,7 @@ warehouses(); <QItem> <QItemSection> <VnInputDate - :label="t('params.landedTo')" + :label="t('extraCommunity.filter.landedTo')" v-model="params.landedTo" @update:model-value="searchFn()" is-outlined @@ -168,7 +168,7 @@ warehouses(); <QItem v-if="warehousesByContinent[params.continent]"> <QItemSection> <VnSelect - :label="t('params.warehouseOutFk')" + :label="t('extraCommunity.filter.warehouseOutFk')" v-model="params.warehouseOutFk" :options="warehousesByContinent[params.continent]" option-value="id" @@ -183,7 +183,7 @@ warehouses(); <QItem v-else> <QItemSection> <VnSelect - :label="t('params.warehouseOutFk')" + :label="t('extraCommunity.filter.warehouseOutFk')" v-model="params.warehouseOutFk" :options="warehousesOptions" option-value="id" @@ -198,7 +198,7 @@ warehouses(); <QItem> <QItemSection> <VnSelect - :label="t('params.warehouseInFk')" + :label="t('extraCommunity.filter.warehouseInFk')" v-model="params.warehouseInFk" :options="warehousesOptions" option-value="id" @@ -213,6 +213,7 @@ warehouses(); <QItem> <QItemSection> <VnSelectSupplier + :label="t('extraCommunity.cargoShip')" v-model="params.cargoSupplierFk" hide-selected dense @@ -221,10 +222,21 @@ warehouses(); /> </QItemSection> </QItem> + <QItem> + <QItemSection> + <VnSelectSupplier + v-model="params.entrySupplierFk" + hide-selected + dense + outlined + rounded + /> + </QItemSection> + </QItem> <QItem> <QItemSection> <VnSelect - :label="t('params.continent')" + :label="t('extraCommunity.filter.continent')" v-model="params.continent" :options="continentsOptions" option-value="code" @@ -240,30 +252,3 @@ warehouses(); </template> </VnFilterPanel> </template> - -<i18n> -en: - params: - id: Id - reference: Reference - totalEntries: Total entries - agencyModeFk: Agency - warehouseInFk: Warehouse In - warehouseOutFk: Warehouse Out - shippedFrom: Shipped from - landedTo: Landed to - cargoSupplierFk: Supplier - continent: Continent out -es: - params: - id: Id - reference: Referencia - totalEntries: Ent. totales - agencyModeFk: Agencia - warehouseInFk: Alm. entrada - warehouseOutFk: Alm. salida - shippedFrom: Llegada desde - landedTo: Llegada hasta - cargoSupplierFk: Proveedor - continent: Cont. Salida -</i18n> diff --git a/src/pages/Travel/TravelList.vue b/src/pages/Travel/TravelList.vue index e90c01be237..b227afcb213 100644 --- a/src/pages/Travel/TravelList.vue +++ b/src/pages/Travel/TravelList.vue @@ -10,6 +10,9 @@ import { getDateQBadgeColor } from 'src/composables/getDateQBadgeColor.js'; import TravelFilter from './TravelFilter.vue'; import VnInputNumber from 'src/components/common/VnInputNumber.vue'; import VnSection from 'src/components/common/VnSection.vue'; +import VnInputTime from 'src/components/common/VnInputTime.vue'; +import VnInputDate from 'src/components/common/VnInputDate.vue'; +import { toDateTimeFormat } from 'src/filters/date'; const { viewSummary } = useSummaryDialog(); const router = useRouter(); @@ -167,6 +170,17 @@ const columns = computed(() => [ cardVisible: true, create: true, }, + { + align: 'left', + name: 'availabled', + label: t('travel.summary.availabled'), + component: 'input', + columnClass: 'expand', + columnField: { + component: null, + }, + format: (row, dashIfEmpty) => dashIfEmpty(toDateTimeFormat(row.availabled)), + }, { align: 'right', label: '', @@ -269,6 +283,16 @@ const columns = computed(() => [ :class="{ 'is-active': row.isReceived }" /> </template> + <template #more-create-dialog="{ data }"> + <VnInputDate + v-model="data.availabled" + :label="t('travel.summary.availabled')" + /> + <VnInputTime + v-model="data.availabled" + :label="t('travel.summary.availabledHour')" + /> + </template> <template #moreFilterPanel="{ params }"> <VnInputNumber :label="t('params.scopeDays')" diff --git a/src/pages/Travel/locale/en.yml b/src/pages/Travel/locale/en.yml new file mode 100644 index 00000000000..ddef66f2f07 --- /dev/null +++ b/src/pages/Travel/locale/en.yml @@ -0,0 +1,22 @@ +extraCommunity: + cargoShip: Cargo ship + searchExtraCommunity: Search for extra community shipping + kg: BI. KG + physicKg: Phy. KG + shipped: W. shipped + landed: W. landed + requiresInspection: Requires inspection + BIP: Boder Inspection Point + notes: Notes + filter: + id: Id + reference: Reference + totalEntries: Total entries + agencyModeFk: Agency + warehouseInFk: Warehouse In + warehouseOutFk: Warehouse Out + shippedFrom: Shipped from + landedTo: Landed to + cargoSupplierFk: Cargo supplier + continent: Continent out + entrySupplierFk: Supplier diff --git a/src/pages/Travel/locale/es.yml b/src/pages/Travel/locale/es.yml new file mode 100644 index 00000000000..1542d889266 --- /dev/null +++ b/src/pages/Travel/locale/es.yml @@ -0,0 +1,23 @@ +extraCommunity: + cargoShip: Carguera + searchExtraCommunity: Buscar por envรญo extra comunitario + kg: KG Bloq. + physicKg: KG fรญsico + shipped: F. envรญo + landed: F. llegada + notes: Notas + Open as PDF: Abrir como PDF + requiresInspection: Requiere inspecciรณn + BIP: Punto de Inspecciรณn Fronteriza + filter: + id: Id + reference: Referencia + totalEntries: Ent. totales + agencyModeFk: Agencia + warehouseInFk: Alm. entrada + warehouseOutFk: Alm. salida + shippedFrom: Llegada desde + landedTo: Llegada hasta + cargoSupplierFk: Carguera + continent: Cont. Salida + entrySupplierFk: Proveedor diff --git a/src/pages/Worker/Card/WorkerDescriptorMenu.vue b/src/pages/Worker/Card/WorkerDescriptorMenu.vue index 8d82dc839f7..0dcb4fd7115 100644 --- a/src/pages/Worker/Card/WorkerDescriptorMenu.vue +++ b/src/pages/Worker/Card/WorkerDescriptorMenu.vue @@ -53,7 +53,7 @@ const showChangePasswordDialog = () => { </QItemSection> </QItem> <QItem - v-if="!worker.user.emailVerified && user.id == worker.id" + v-if="!worker.user.emailVerified && user.id != worker.id" v-ripple clickable @click="showChangePasswordDialog" diff --git a/src/pages/Worker/Card/WorkerFormation.vue b/src/pages/Worker/Card/WorkerFormation.vue index e05eca7f8c5..e8680f7dd84 100644 --- a/src/pages/Worker/Card/WorkerFormation.vue +++ b/src/pages/Worker/Card/WorkerFormation.vue @@ -119,7 +119,7 @@ const columns = computed(() => [ :url="`Workers/${entityId}/trainingCourse`" :url-create="`Workers/${entityId}/trainingCourse`" save-url="TrainingCourses/crud" - :filter="courseFilter" + :user-filter="courseFilter" :create="{ urlCreate: 'trainingCourses', title: t('Create training course'), diff --git a/src/pages/Worker/Card/WorkerMedical.vue b/src/pages/Worker/Card/WorkerMedical.vue index c220df76a2c..c04f6496b9f 100644 --- a/src/pages/Worker/Card/WorkerMedical.vue +++ b/src/pages/Worker/Card/WorkerMedical.vue @@ -3,11 +3,23 @@ import { ref, computed } from 'vue'; import { useI18n } from 'vue-i18n'; import { useRoute } from 'vue-router'; import VnTable from 'components/VnTable/VnTable.vue'; +import { dashIfEmpty } from 'src/filters'; const tableRef = ref(); const { t } = useI18n(); const route = useRoute(); const entityId = computed(() => route.params.id); +const centerFilter = { + include: [ + { + relation: 'center', + scope: { + fields: ['id', 'name'], + }, + }, + ], +}; + const columns = [ { align: 'left', @@ -36,6 +48,9 @@ const columns = [ url: 'medicalCenters', fields: ['id', 'name'], }, + format: (row, dashIfEmpty) => { + return dashIfEmpty(row.center?.name); + }, }, { align: 'left', @@ -84,6 +99,7 @@ const columns = [ ref="tableRef" data-key="WorkerMedical" :url="`Workers/${entityId}/medicalReview`" + :user-filter="centerFilter" save-url="MedicalReviews/crud" :create="{ urlCreate: 'medicalReviews', diff --git a/src/pages/Worker/Card/WorkerPit.vue b/src/pages/Worker/Card/WorkerPit.vue index 40e814452ea..3de60d6a0f7 100644 --- a/src/pages/Worker/Card/WorkerPit.vue +++ b/src/pages/Worker/Card/WorkerPit.vue @@ -176,6 +176,7 @@ const deleteRelative = async (id) => { :label="t('isDescendant')" v-model="row.isDescendant" class="q-gutter-xs q-mb-xs" + data-cy="Descendant/Ascendant" /> <VnSelect :label="t('disabilityGrades')" diff --git a/src/pages/Zone/Card/ZoneBasicData.vue b/src/pages/Zone/Card/ZoneBasicData.vue index 2e9b61deea2..03013f011b9 100644 --- a/src/pages/Zone/Card/ZoneBasicData.vue +++ b/src/pages/Zone/Card/ZoneBasicData.vue @@ -1,6 +1,6 @@ <script setup> import { useI18n } from 'vue-i18n'; -import { computed, ref } from 'vue'; +import { ref } from 'vue'; import FetchData from 'components/FetchData.vue'; import FormModel from 'src/components/FormModel.vue'; import VnRow from 'components/ui/VnRow.vue'; @@ -9,33 +9,23 @@ import VnInputTime from 'src/components/common/VnInputTime.vue'; import VnSelect from 'src/components/common/VnSelect.vue'; const { t } = useI18n(); - -const agencyFilter = { - fields: ['id', 'name'], - order: 'name ASC', - limit: 30, -}; -const agencyOptions = ref([]); const validAddresses = ref([]); +const addresses = ref([]); -const filterWhere = computed(() => ({ - id: { inq: validAddresses.value.map((item) => item.addressFk) }, -})); +const setFilteredAddresses = (data) => { + const validIds = new Set(validAddresses.value.map((item) => item.addressFk)); + addresses.value = data.filter((address) => validIds.has(address.id)); +}; </script> <template> - <FetchData - :filter="agencyFilter" - @on-fetch="(data) => (agencyOptions = data)" - auto-load - url="AgencyModes/isActive" - /> <FetchData url="RoadmapAddresses" auto-load @on-fetch="(data) => (validAddresses = data)" /> - <FormModel :url="`Zones/${$route.params.id}`" auto-load data-key="Zone"> + <FetchData url="Addresses" auto-load @on-fetch="setFilteredAddresses" /> + <FormModel auto-load model="Zone"> <template #form="{ data, validate }"> <VnRow> <VnInput @@ -43,9 +33,9 @@ const filterWhere = computed(() => ({ :label="t('Name')" clearable v-model="data.name" + :required="true" /> </VnRow> - <VnRow> <VnSelect v-model="data.agencyModeFk" @@ -94,7 +84,7 @@ const filterWhere = computed(() => ({ type="number" min="0" /> - <VnInputTime v-model="data.hour" :label="t('Closing')" /> + <VnInputTime v-model="data.hour" :label="t('Closing')" :required="true" /> </VnRow> <VnRow> @@ -103,7 +93,7 @@ const filterWhere = computed(() => ({ :label="t('Price')" type="number" min="0" - required="true" + :required="true" clearable /> <VnInput @@ -111,7 +101,7 @@ const filterWhere = computed(() => ({ :label="t('Price optimum')" type="number" min="0" - required="true" + :required="true" clearable /> </VnRow> @@ -128,7 +118,7 @@ const filterWhere = computed(() => ({ v-model="data.addressFk" option-value="id" option-label="nickname" - url="Addresses" + :options="addresses" :fields="['id', 'nickname']" sort-by="id" hide-selected diff --git a/src/pages/Zone/Card/ZoneCalendar.vue b/src/pages/Zone/Card/ZoneCalendar.vue deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/pages/Zone/ZoneFilterPanel.vue b/src/pages/Zone/ZoneFilterPanel.vue index 3a35527ab6a..bbe12189a22 100644 --- a/src/pages/Zone/ZoneFilterPanel.vue +++ b/src/pages/Zone/ZoneFilterPanel.vue @@ -38,7 +38,12 @@ const agencies = ref([]); <template #body="{ params, searchFn }"> <QItem> <QItemSection> - <VnInput :label="t('list.name')" v-model="params.name" is-outlined /> + <VnInput + :label="t('list.name')" + v-model="params.name" + is-outlined + data-cy="zoneFilterPanelNameInput" + /> </QItemSection> </QItem> <QItem> @@ -53,6 +58,7 @@ const agencies = ref([]); dense outlined rounded + data-cy="zoneFilterPanelAgencySelect" > </VnSelect> </QItemSection> diff --git a/src/pages/Zone/ZoneList.vue b/src/pages/Zone/ZoneList.vue index 1fa539c9107..a82bbb28540 100644 --- a/src/pages/Zone/ZoneList.vue +++ b/src/pages/Zone/ZoneList.vue @@ -65,7 +65,6 @@ const tableFilter = { const columns = computed(() => [ { - align: 'left', name: 'id', label: t('list.id'), chip: { @@ -75,6 +74,8 @@ const columns = computed(() => [ columnFilter: { inWhere: true, }, + columnClass: 'shrink-column', + component: 'number', }, { align: 'left', @@ -106,7 +107,6 @@ const columns = computed(() => [ format: (row, dashIfEmpty) => dashIfEmpty(row?.agencyMode?.name), }, { - align: 'left', name: 'price', label: t('list.price'), cardVisible: true, @@ -114,9 +114,11 @@ const columns = computed(() => [ columnFilter: { inWhere: true, }, + columnClass: 'shrink-column', + component: 'number', }, { - align: 'left', + align: 'center', name: 'hour', label: t('list.close'), cardVisible: true, @@ -129,6 +131,7 @@ const columns = computed(() => [ label: t('list.addressFk'), cardVisible: true, columnFilter: false, + columnClass: 'expand', }, { align: 'right', @@ -177,67 +180,73 @@ function formatRow(row) { <ZoneFilterPanel data-key="ZonesList" /> </template> </RightMenu> - <VnTable - ref="tableRef" - data-key="ZonesList" - url="Zones" - :create="{ - urlCreate: 'Zones', - title: t('list.createZone'), - onDataSaved: ({ id }) => tableRef.redirect(`${id}/location`), - formInitialData: {}, - }" - :user-filter="tableFilter" - :columns="columns" - redirect="zone" - :right-search="false" - > - <template #column-addressFk="{ row }"> - {{ dashIfEmpty(formatRow(row)) }} - </template> - <template #more-create-dialog="{ data }"> - <VnSelect - url="AgencyModes" - v-model="data.agencyModeFk" - option-value="id" - option-label="name" - :label="t('list.agency')" - /> - <VnInput - v-model="data.price" - :label="t('list.price')" - min="0" - type="number" - required="true" - /> - <VnInput - v-model="data.bonus" - :label="t('zone.bonus')" - min="0" - type="number" - /> - <VnInput - v-model="data.travelingDays" - :label="t('zone.travelingDays')" - type="number" - min="0" - /> - <VnInputTime v-model="data.hour" :label="t('list.close')" /> - <VnSelect - url="Warehouses" - v-model="data.warehouseFK" - option-value="id" - option-label="name" - :label="t('list.warehouse')" - :options="warehouseOptions" - /> - <QCheckbox - v-model="data.isVolumetric" - :label="t('list.isVolumetric')" - :toggle-indeterminate="false" - /> - </template> - </VnTable> + <div class="table-container"> + <div class="column items-center"> + <VnTable + ref="tableRef" + data-key="ZonesList" + url="Zones" + :create="{ + urlCreate: 'Zones', + title: t('list.createZone'), + onDataSaved: ({ id }) => tableRef.redirect(`${id}/location`), + formInitialData: {}, + }" + :user-filter="tableFilter" + :columns="columns" + redirect="zone" + :right-search="false" + table-height="85vh" + order="id ASC" + > + <template #column-addressFk="{ row }"> + {{ dashIfEmpty(formatRow(row)) }} + </template> + <template #more-create-dialog="{ data }"> + <VnSelect + url="AgencyModes" + v-model="data.agencyModeFk" + option-value="id" + option-label="name" + :label="t('list.agency')" + /> + <VnInput + v-model="data.price" + :label="t('list.price')" + min="0" + type="number" + required="true" + /> + <VnInput + v-model="data.bonus" + :label="t('zone.bonus')" + min="0" + type="number" + /> + <VnInput + v-model="data.travelingDays" + :label="t('zone.travelingDays')" + type="number" + min="0" + /> + <VnInputTime v-model="data.hour" :label="t('list.close')" /> + <VnSelect + url="Warehouses" + v-model="data.warehouseFK" + option-value="id" + option-label="name" + :label="t('list.warehouse')" + :options="warehouseOptions" + /> + <QCheckbox + v-model="data.isVolumetric" + :label="t('list.isVolumetric')" + :toggle-indeterminate="false" + /> + </template> + </VnTable> + </div> + </div> </template> <i18n> @@ -245,3 +254,20 @@ es: Search zone: Buscar zona You can search zones by id or name: Puedes buscar zonas por id o nombre </i18n> + +<style lang="scss" scoped> +.table-container { + display: flex; + justify-content: center; +} +.column { + display: flex; + flex-direction: column; + align-items: center; + min-width: 70%; +} + +:deep(.shrink-column) { + width: 8%; +} +</style> diff --git a/src/pages/Zone/ZoneUpcoming.vue b/src/pages/Zone/ZoneUpcoming.vue index c74ae6078f6..adcdfbc0447 100644 --- a/src/pages/Zone/ZoneUpcoming.vue +++ b/src/pages/Zone/ZoneUpcoming.vue @@ -56,7 +56,7 @@ onMounted(() => weekdayStore.initStore()); <ZoneSearchbar /> <VnSubToolbar /> <QPage class="column items-center q-pa-md"> - <QCard class="full-width q-pa-md"> + <QCard class="containerShrinked q-pa-md"> <div v-for="(detail, index) in details" :key="index" diff --git a/src/pages/Zone/locale/en.yml b/src/pages/Zone/locale/en.yml index 5fd1a3ea752..e53e7b560af 100644 --- a/src/pages/Zone/locale/en.yml +++ b/src/pages/Zone/locale/en.yml @@ -44,6 +44,8 @@ summary: filterPanel: name: Name agencyModeFk: Agency + id: ID + price: Price deliveryPanel: pickup: Pick up delivery: Delivery diff --git a/src/pages/Zone/locale/es.yml b/src/pages/Zone/locale/es.yml index 575b12f7af9..bc31e74a957 100644 --- a/src/pages/Zone/locale/es.yml +++ b/src/pages/Zone/locale/es.yml @@ -45,6 +45,8 @@ summary: filterPanel: name: Nombre agencyModeFk: Agencia + id: ID + price: Precio deliveryPanel: pickup: Recogida delivery: Entrega diff --git a/test/cypress/integration/Order/orderCatalog.spec.js b/test/cypress/integration/Order/orderCatalog.spec.js index cffc47f9150..1770a6b56e9 100644 --- a/test/cypress/integration/Order/orderCatalog.spec.js +++ b/test/cypress/integration/Order/orderCatalog.spec.js @@ -45,7 +45,6 @@ describe('OrderCatalog', () => { ).type('{enter}'); cy.get(':nth-child(1) > [data-cy="catalogFilterCategory"]').click(); cy.dataCy('catalogFilterValueDialogBtn').last().click(); - cy.get('[data-cy="catalogFilterValueDialogTagSelect"]').click(); cy.selectOption("[data-cy='catalogFilterValueDialogTagSelect']", 'Tallos'); cy.dataCy('catalogFilterValueDialogValueInput').find('input').focus(); cy.dataCy('catalogFilterValueDialogValueInput').find('input').type('2'); diff --git a/test/cypress/integration/client/clientAddress.spec.js b/test/cypress/integration/client/clientAddress.spec.js index db876b64bb4..434180047eb 100644 --- a/test/cypress/integration/client/clientAddress.spec.js +++ b/test/cypress/integration/client/clientAddress.spec.js @@ -3,11 +3,46 @@ describe('Client consignee', () => { beforeEach(() => { cy.viewport(1280, 720); cy.login('developer'); - cy.visit('#/customer/1110/address', { - timeout: 5000, - }); + cy.visit('#/customer/1107/address'); + cy.domContentLoad(); }); it('Should load layout', () => { cy.get('.q-card').should('be.visible'); }); + + it('check as equalizated', function () { + cy.get('.q-card__section > .address-card').then(($el) => { + let addressCards_before = $el.length; + + cy.get('.q-page-sticky > div > .q-btn').click(); + const addressName = 'test'; + cy.dataCy('Consignee_input').type(addressName); + cy.dataCy('Location_select').click(); + cy.get('[role="listbox"] .q-item:nth-child(1)').click(); + cy.dataCy('Street address_input').type('TEST ADDRESS'); + cy.get('.q-btn-group > .q-btn--standard').click(); + cy.location('href').should('contain', '#/customer/1107/address'); + cy.get('.q-card__section > .address-card').should( + 'have.length', + addressCards_before + 1, + ); + cy.get('.q-card__section > .address-card') + .eq(addressCards_before) + .should('be.visible') + .get('.text-weight-bold') + .eq(addressCards_before - 1) + .should('contain', addressName) + .click(); + }); + cy.get( + '.q-card > :nth-child(1) > :nth-child(2) > .q-checkbox > .q-checkbox__inner', + ) + .should('have.class', 'q-checkbox__inner--falsy') + .click(); + + cy.get('.q-btn-group > .q-btn--standard > .q-btn__content').click(); + cy.get( + ':nth-child(2) > :nth-child(2) > .flex > .q-mr-lg > .q-checkbox__inner', + ).should('have.class', 'q-checkbox__inner--truthy'); + }); }); diff --git a/test/cypress/integration/client/clientFiscalData.spec.js b/test/cypress/integration/client/clientFiscalData.spec.js index 05e0772e920..d189f896aec 100644 --- a/test/cypress/integration/client/clientFiscalData.spec.js +++ b/test/cypress/integration/client/clientFiscalData.spec.js @@ -3,9 +3,8 @@ describe('Client fiscal data', () => { beforeEach(() => { cy.viewport(1280, 720); cy.login('developer'); - cy.visit('#/customer/1107/fiscal-data', { - timeout: 5000, - }); + cy.visit('#/customer/1107/fiscal-data'); + cy.domContentLoad(); }); it('Should change required value when change customer', () => { cy.get('.q-card').should('be.visible'); @@ -15,4 +14,25 @@ describe('Client fiscal data', () => { cy.get('.q-item > .q-item__label').should('have.text', ' #1'); cy.dataCy('sageTaxTypeFk').filter('input').should('have.attr', 'required'); }); + + it('check as equalizated', () => { + cy.get( + ':nth-child(1) > .q-checkbox > .q-checkbox__inner > .q-checkbox__bg', + ).click(); + cy.get('.q-btn-group > .q-btn--standard > .q-btn__content').click(); + + cy.get('.q-card > :nth-child(1) > span').should( + 'contain', + 'You changed the equalization tax', + ); + + cy.get('.q-card > :nth-child(2) > span').should( + 'have.text', + 'Do you want to spread the change?', + ); + cy.get('[data-cy="VnConfirm_confirm"] > .q-btn__content > .block').click(); + cy.get( + '.bg-warning > .q-notification__wrapper > .q-notification__content > .q-notification__message', + ).should('have.text', 'Equivalent tax spreaded'); + }); }); diff --git a/test/cypress/integration/entry/entryList.spec.js b/test/cypress/integration/entry/entryList.spec.js index 5e2fa0c0156..4f99f0cb6f1 100644 --- a/test/cypress/integration/entry/entryList.spec.js +++ b/test/cypress/integration/entry/entryList.spec.js @@ -106,8 +106,9 @@ describe('Entry', () => { cy.get(`td[data-col-field="${field}"][data-row-index="${row}"]`); const selectSpan = (field, row = 0) => selectCell(field, row).find('div > span'); const selectButton = (cySelector) => cy.get(`button[data-cy="${cySelector}"]`); - const clickAndType = (field, value, row = 0) => - selectCell(field, row).click().type(value); + const clickAndType = (field, value, row = 0) => { + selectCell(field, row).click().type(`${value}{esc}`); + }; const checkText = (field, expectedText, row = 0) => selectCell(field, row).should('have.text', expectedText); const checkColor = (field, expectedColor, row = 0) => @@ -115,21 +116,18 @@ describe('Entry', () => { createEntryAndBuy(); - selectCell('isIgnored') - .click() - .click() - .trigger('keydown', { key: 'Tab', keyCode: 9, which: 9 }); - checkText('isIgnored', 'check'); - checkColor('quantity', COLORS.negative); + selectCell('isIgnored').click().click().type('{esc}'); + checkText('isIgnored', 'close'); clickAndType('stickers', '1'); - checkText('quantity', '11'); - checkText('amount', '550.00'); + checkText('stickers', '0/01'); + checkText('quantity', '1'); + checkText('amount', '50.00'); clickAndType('packing', '2'); - checkText('packing', '12close'); + checkText('packing', '12'); checkText('weight', '12.0'); - checkText('quantity', '132'); - checkText('amount', '6600.00'); + checkText('quantity', '12'); + checkText('amount', '600.00'); checkColor('packing', COLORS.enabled); selectCell('groupingMode').click().click().click(); @@ -137,7 +135,7 @@ describe('Entry', () => { checkColor('grouping', COLORS.enabled); selectCell('buyingValue').click().clear().type('{backspace}{backspace}1'); - checkText('amount', '132.00'); + checkText('amount', '12.00'); checkColor('minPrice', COLORS.disable); selectCell('hasMinPrice').click().click(); @@ -145,7 +143,7 @@ describe('Entry', () => { selectCell('hasMinPrice').click(); cy.saveCard(); - cy.get('span[data-cy="footer-stickers"]').should('have.text', '11'); + cy.get('span[data-cy="footer-stickers"]').should('have.text', '1'); cy.get('.q-notification__message').contains('Data saved'); selectButton('change-quantity-sign').should('be.disabled'); @@ -156,9 +154,9 @@ describe('Entry', () => { selectButton('change-quantity-sign').click(); selectButton('set-negative-quantity').click(); - checkText('quantity', '-132'); + checkText('quantity', '-12'); selectButton('set-positive-quantity').click(); - checkText('quantity', '132'); + checkText('quantity', '12'); checkColor('amount', COLORS.disable); selectButton('check-buy-amount').click(); diff --git a/test/cypress/integration/entry/myEntry.spec.js b/test/cypress/integration/entry/myEntry.spec.js index 49d75cf3924..ed469d9e2e5 100644 --- a/test/cypress/integration/entry/myEntry.spec.js +++ b/test/cypress/integration/entry/myEntry.spec.js @@ -8,11 +8,9 @@ describe('EntryMy when is supplier', () => { }, }); }); - + it('should open buyLabel when is supplier', () => { - cy.get( - '[to="/null/3"] > .q-card > :nth-child(2) > .q-btn > .q-btn__content > .q-icon' - ).click(); + cy.dataCy('cardBtn').eq(2).click(); cy.dataCy('printLabelsBtn').click(); cy.window().its('open').should('be.called'); }); diff --git a/test/cypress/integration/entry/stockBought.spec.js b/test/cypress/integration/entry/stockBought.spec.js index d2d2b414de5..bc36156b4e4 100644 --- a/test/cypress/integration/entry/stockBought.spec.js +++ b/test/cypress/integration/entry/stockBought.spec.js @@ -6,7 +6,7 @@ describe('EntryStockBought', () => { }); it('Should edit the reserved space', () => { cy.get('.q-field__native.q-placeholder').should('have.value', '01/01/2001'); - cy.get('td[data-col-field="reserve"]').click(); + cy.get('[data-col-field="reserve"][data-row-index="0"]').click(); cy.get('input[name="reserve"]').type('10{enter}'); cy.get('button[title="Save"]').click(); cy.get('.q-notification__message').should('have.text', 'Data saved'); @@ -16,25 +16,35 @@ describe('EntryStockBought', () => { cy.get('input[aria-label="Reserve"]').type('1'); cy.get('input[aria-label="Date"]').eq(1).clear(); cy.get('input[aria-label="Date"]').eq(1).type('01-01'); - cy.get('input[aria-label="Buyer"]').type('buyerboss{downarrow}{enter}'); + cy.get('input[aria-label="Buyer"]').type('buyerBossNick'); + cy.get('div[role="listbox"] > div > div[role="option"]') + .eq(0) + .should('be.visible') + .click(); + + cy.get('[data-cy="FormModelPopup_save"]').click(); cy.get('.q-notification__message').should('have.text', 'Data created'); + + cy.get('[data-col-field="reserve"][data-row-index="1"]').click().clear(); + cy.get('[data-cy="searchBtn"]').eq(1).click(); + cy.get('.q-table__bottom.row.items-center.q-table__bottom--nodata') + .should('have.text', 'warningNo data available') + .type('{esc}'); + cy.get('[data-col-field="reserve"][data-row-index="1"]') + .click() + .type('{backspace}{enter}'); + cy.get('[data-cy="crudModelDefaultSaveBtn"]').should('be.enabled').click(); + cy.get('.q-notification__message').eq(1).should('have.text', 'Data saved'); }); it('Should check detail for the buyer', () => { - cy.get(':nth-child(1) > .sticky > .q-btn > .q-btn__content > .q-icon').click(); + cy.get('[data-cy="searchBtn"]').eq(0).click(); cy.get('tBody > tr').eq(1).its('length').should('eq', 1); }); - it('Should check detail for the buyerBoss and had no content', () => { - cy.get(':nth-child(2) > .sticky > .q-btn > .q-btn__content > .q-icon').click(); - cy.get('.q-table__bottom.row.items-center.q-table__bottom--nodata').should( - 'have.text', - 'warningNo data available', - ); - }); + it('Should edit travel m3 and refresh', () => { - cy.get('.vn-row > div > .q-btn > .q-btn__content > .q-icon').click(); - cy.get('input[aria-label="m3"]').clear(); - cy.get('input[aria-label="m3"]').type('60'); - cy.get('.q-mt-lg > .q-btn--standard > .q-btn__content > .block').click(); + cy.get('[data-cy="edit-travel"]').should('be.visible').click(); + cy.get('input[aria-label="m3"]').clear().type('60'); + cy.get('[data-cy="FormModelPopup_save"]').click(); cy.get('.vn-row > div > :nth-child(2)').should('have.text', '60'); }); }); diff --git a/test/cypress/integration/invoiceIn/invoiceInVat.spec.js b/test/cypress/integration/invoiceIn/invoiceInVat.spec.js index f8b403a458f..1e7ce1003b7 100644 --- a/test/cypress/integration/invoiceIn/invoiceInVat.spec.js +++ b/test/cypress/integration/invoiceIn/invoiceInVat.spec.js @@ -36,7 +36,7 @@ describe('InvoiceInVat', () => { cy.get(dialogInputs).eq(0).type(randomInt); cy.get(dialogInputs).eq(1).type('This is a dummy expense'); - cy.get('button[type="submit"]').click(); + cy.get('[data-cy="FormModelPopup_save"]').click(); cy.get('.q-notification__message').should('have.text', 'Data created'); }); }); diff --git a/test/cypress/integration/invoiceOut/invoiceOutList.spec.js b/test/cypress/integration/invoiceOut/invoiceOutList.spec.js index 82f0fa3b631..d3a84d226b4 100644 --- a/test/cypress/integration/invoiceOut/invoiceOutList.spec.js +++ b/test/cypress/integration/invoiceOut/invoiceOutList.spec.js @@ -1,6 +1,16 @@ /// <reference types="cypress" /> describe('InvoiceOut list', () => { const serial = 'Espaรฑola rapida'; + const columnCheckbox = + '.bg-header > :nth-child(1) > .q-checkbox > .q-checkbox__inner'; + const firstRowDescriptor = + 'tbody > :nth-child(1) > [data-col-field="clientFk"] > .no-padding > .link'; + const firstRowCheckbox = + 'tbody > :nth-child(1) > :nth-child(1) > .q-checkbox > .q-checkbox__inner '; + const summaryPopupIcon = '.header > :nth-child(2) > .q-btn__content > .q-icon'; + const filterBtn = '.q-scrollarea__content > .q-btn--standard > .q-btn__content'; + const firstSummaryIcon = + ':nth-child(1) > .text-right > [data-cy="tableAction-0"] > .q-btn__content > .q-icon'; beforeEach(() => { cy.viewport(1920, 1080); @@ -9,18 +19,32 @@ describe('InvoiceOut list', () => { cy.typeSearchbar('{enter}'); }); - it('should search and filter an invoice and enter to the summary', () => { - cy.typeSearchbar('1{enter}'); - cy.get('.q-virtual-scroll__content > :nth-child(2) > :nth-child(7)').click(); - cy.get('.header > a.q-btn > .q-btn__content').click(); - cy.typeSearchbar('{enter}'); - cy.dataCy('InvoiceOutFilterAmountBtn').find('input').type('8.88{enter}'); + it('should download one pdf from the subtoolbar button', () => { + cy.get(firstRowCheckbox).click(); + cy.dataCy('InvoiceOutDownloadPdfBtn').click(); }); it('should download all pdfs', () => { - cy.get('.bg-header > :nth-child(1) > .q-checkbox > .q-checkbox__inner').click(); + cy.get(columnCheckbox).click(); cy.dataCy('InvoiceOutDownloadPdfBtn').click(); - cy.get('.bg-header > :nth-child(1) > .q-checkbox > .q-checkbox__inner').click(); + }); + + it('should open the invoice descriptor from table icon', () => { + cy.get(firstSummaryIcon).click(); + cy.get('.cardSummary').should('be.visible'); + cy.get('.summaryHeader > div').should('include.text', 'A1111111'); + }); + + it('should open the client descriptor', () => { + cy.get(firstRowDescriptor).click(); + cy.get(summaryPopupIcon).click(); + }); + + it('should filter the results by client ID, then check the first result is correct', () => { + cy.dataCy('Customer ID_input').type('1103'); + cy.get(filterBtn).click(); + cy.get(firstRowDescriptor).click(); + cy.get('.q-item > .q-item__label').should('include.text', '1103'); }); it('should give an error when manual invoicing a ticket that is already invoiced', () => { @@ -31,11 +55,14 @@ describe('InvoiceOut list', () => { cy.checkNotification('This ticket is already invoiced'); }); - it('should create a manual invoice and enter to its summary', () => { + it('should create a manual invoice and enter to its summary, then delete that invoice', () => { cy.dataCy('vnTableCreateBtn').click(); - cy.dataCy('InvoiceOutCreateTicketinput').type(8); + cy.dataCy('InvoiceOutCreateTicketinput').type(9); cy.selectOption('[data-cy="InvoiceOutCreateSerialSelect"]', serial); cy.dataCy('FormModelPopup_save').click(); cy.checkNotification('Data created'); + cy.dataCy('descriptor-more-opts').click(); + cy.get('.q-menu > .q-list > :nth-child(4)').click(); + cy.dataCy('VnConfirm_confirm').click(); }); }); diff --git a/test/cypress/integration/invoiceOut/invoiceOutNegativeBases.spec.js b/test/cypress/integration/invoiceOut/invoiceOutNegativeBases.spec.js index 02b7fbb43ce..4d530de05fe 100644 --- a/test/cypress/integration/invoiceOut/invoiceOutNegativeBases.spec.js +++ b/test/cypress/integration/invoiceOut/invoiceOutNegativeBases.spec.js @@ -1,11 +1,26 @@ /// <reference types="cypress" /> describe('InvoiceOut negative bases', () => { + const getDescriptors = (opt) => + `:nth-child(1) > [data-col-field="${opt}"] > .no-padding > .link`; + beforeEach(() => { cy.viewport(1920, 1080); cy.login('developer'); cy.visit(`/#/invoice-out/negative-bases`); }); + it('should open the posible descriptors', () => { + cy.get(getDescriptors('clientId')).click(); + cy.get('.descriptor').should('be.visible'); + cy.get('.q-item > .q-item__label').should('include.text', '1101'); + cy.get(getDescriptors('ticketFk')).click(); + cy.get('.descriptor').should('be.visible'); + cy.get('.q-item > .q-item__label').should('include.text', '23'); + cy.get(getDescriptors('workerName')).click(); + cy.get('.descriptor').should('be.visible'); + cy.get('.q-item > .q-item__label').should('include.text', '18'); + }); + it('should filter and download as CSV', () => { cy.get('input[name="ticketFk"]').type('23{enter}'); cy.get('#subToolbar > .q-btn').click(); diff --git a/test/cypress/integration/invoiceOut/invoiceOutSummary.spec.js b/test/cypress/integration/invoiceOut/invoiceOutSummary.spec.js index 44b0a996180..333f7e2c482 100644 --- a/test/cypress/integration/invoiceOut/invoiceOutSummary.spec.js +++ b/test/cypress/integration/invoiceOut/invoiceOutSummary.spec.js @@ -5,40 +5,91 @@ describe('InvoiceOut summary', () => { Type: { val: 'Error in customer data', type: 'select' }, }; + const firstRowDescriptors = (opt) => + `tbody > :nth-child(1) > :nth-child(${opt}) > .q-btn`; + const toCustomerSummary = '[href="#/customer/1101"]'; + const toTicketList = '[href="#/ticket/list?table={%22refFk%22:%22T1111111%22}"]'; + const selectMenuOption = (opt) => `.q-menu > .q-list > :nth-child(${opt})`; + const confirmSend = '.q-btn--unelevated'; + beforeEach(() => { cy.viewport(1920, 1080); cy.login('developer'); - cy.visit(`/#/invoice-out/list`); + cy.visit(`/#/invoice-out/1/summary`); }); - it('should generate the invoice PDF', () => { - cy.typeSearchbar('T1111111{enter}'); - cy.dataCy('descriptor-more-opts').click(); - cy.get('.q-menu > .q-list > :nth-child(6)').click(); - cy.dataCy('VnConfirm_confirm').click(); - cy.checkNotification('The invoice PDF document has been regenerated'); + it('open the descriptors', () => { + cy.get(firstRowDescriptors(1)).click(); + cy.get('.descriptor').should('be.visible'); + cy.get('.q-item > .q-item__label').should('include.text', '1'); + cy.get(firstRowDescriptors(2)).click(); + cy.get('.descriptor').should('be.visible'); + cy.get('.q-item > .q-item__label').should('include.text', '1101'); }); - it('should refund the invoice ', () => { + + it('should open the client summary and the ticket list', () => { + cy.get(toCustomerSummary).click(); + cy.get('.descriptor').should('be.visible'); + cy.get('.q-item > .q-item__label').should('include.text', '1101'); + }); + + it('should open the ticket list', () => { + cy.get(toTicketList).click(); + cy.get('.descriptor').should('be.visible'); + cy.dataCy('vnFilterPanelChip').should('include.text', 'T1111111'); + }); + + it('should transfer the invoice ', () => { cy.typeSearchbar('T1111111{enter}'); cy.dataCy('descriptor-more-opts').click(); - cy.get('.q-menu > .q-list > :nth-child(7)').click(); - cy.get('#q-portal--menu--3 > .q-menu > .q-list > :nth-child(2)').click(); - cy.checkNotification('The following refund ticket have been created'); + cy.get(selectMenuOption(1)).click(); + cy.fillInForm(transferInvoice); + cy.get('.q-mt-lg > .q-btn').click(); + cy.checkNotification('Transferred invoice'); + }); + + it('should send the invoice as PDF', () => { + cy.dataCy('descriptor-more-opts').click(); + cy.get(selectMenuOption(3)).click(); + cy.dataCy('InvoiceOutDescriptorMenuSendPdfOption').click(); + cy.get(confirmSend).click(); + cy.checkNotification('Notification sent'); + }); + + it('should send the invoice as CSV', () => { + cy.dataCy('descriptor-more-opts').click(); + cy.get(selectMenuOption(3)).click(); + cy.dataCy('InvoiceOutDescriptorMenuSendCsvOption').click(); + cy.get(confirmSend).click(); + cy.checkNotification('Notification sent'); }); it('should delete an invoice ', () => { cy.typeSearchbar('T2222222{enter}'); cy.dataCy('descriptor-more-opts').click(); - cy.get('.q-menu > .q-list > :nth-child(4)').click(); + cy.get(selectMenuOption(4)).click(); cy.dataCy('VnConfirm_confirm').click(); cy.checkNotification('InvoiceOut deleted'); }); - it('should transfer the invoice ', () => { - cy.typeSearchbar('T1111111{enter}'); + + it('should book the invoice', () => { cy.dataCy('descriptor-more-opts').click(); - cy.get('.q-menu > .q-list > :nth-child(1)').click(); - cy.fillInForm(transferInvoice); - cy.get('.q-mt-lg > .q-btn').click(); - cy.checkNotification('Transferred invoice'); + cy.get(selectMenuOption(5)).click(); + cy.dataCy('VnConfirm_confirm').click(); + cy.checkNotification('InvoiceOut booked'); + }); + + it('should generate the invoice PDF', () => { + cy.dataCy('descriptor-more-opts').click(); + cy.get(selectMenuOption(6)).click(); + cy.dataCy('VnConfirm_confirm').click(); + cy.checkNotification('The invoice PDF document has been regenerated'); + }); + + it('should refund the invoice ', () => { + cy.dataCy('descriptor-more-opts').click(); + cy.get(selectMenuOption(7)).click(); + cy.get('#q-portal--menu--3 > .q-menu > .q-list > :nth-child(2)').click(); + cy.checkNotification('The following refund ticket have been created'); }); }); diff --git a/test/cypress/integration/route/routeExtendedList.spec.js b/test/cypress/integration/route/routeExtendedList.spec.js new file mode 100644 index 00000000000..34d3d3a29f0 --- /dev/null +++ b/test/cypress/integration/route/routeExtendedList.spec.js @@ -0,0 +1,205 @@ +describe('Route extended list', () => { + const getSelector = (colField) => `tr:last-child > [data-col-field="${colField}"]`; + + const selectors = { + worker: getSelector('workerFk'), + agency: getSelector('agencyModeFk'), + vehicle: getSelector('vehicleFk'), + date: getSelector('dated'), + description: getSelector('description'), + served: getSelector('isOk'), + lastRowSelectCheckBox: 'tbody > tr:last-child > :nth-child(1) .q-checkbox__inner', + removeBtn: '[title="Remove"]', + resetBtn: '[title="Reset"]', + confirmBtn: 'VnConfirm_confirm', + saveBtn: 'crudModelDefaultSaveBtn', + saveFormBtn: 'FormModelPopup_save', + cloneBtn: '#st-actions > .q-btn-group > :nth-child(1)', + downloadBtn: '#st-actions > .q-btn-group > :nth-child(2)', + markServedBtn: '#st-actions > .q-btn-group > :nth-child(3)', + searchbar: 'searchbar', + firstTicketsRowSelectCheckBox: + '.q-card > :nth-child(2) > .q-table__container > .q-table__middle > .q-table > tbody > :nth-child(1) > .q-table--col-auto-width > .q-checkbox > .q-checkbox__inner > .q-checkbox__bg > .q-checkbox__svg', + }; + + const checkboxState = { + check: 'check', + uncheck: 'close', + }; + const url = '/#/route/extended-list'; + const dataCreated = 'Data created'; + const dataSaved = 'Data saved'; + + const originalFields = [ + { selector: selectors.worker, type: 'select', value: 'logistic' }, + { selector: selectors.agency, type: 'select', value: 'Super-Man delivery' }, + { selector: selectors.vehicle, type: 'select', value: '3333-IMK' }, + { selector: selectors.date, type: 'date', value: '01/02/2024' }, + { selector: selectors.description, type: 'input', value: 'Test route' }, + { selector: selectors.served, type: 'checkbox', value: checkboxState.uncheck }, + ]; + + const updateFields = [ + { selector: selectors.worker, type: 'select', value: 'salesperson' }, + { selector: selectors.agency, type: 'select', value: 'inhouse pickup' }, + { selector: selectors.vehicle, type: 'select', value: '1111-IMK' }, + { selector: selectors.date, type: 'date', value: '01/01/2001' }, + { selector: selectors.description, type: 'input', value: 'Description updated' }, + { selector: selectors.served, type: 'checkbox', value: checkboxState.check }, + ]; + + function fillField(selector, type, value) { + switch (type) { + case 'select': + cy.get(selector).should('be.visible').click(); + cy.dataCy('null_select').clear().type(value); + cy.get('.q-item').contains(value).click(); + break; + case 'input': + cy.get(selector).should('be.visible').click(); + cy.dataCy('null_input').clear().type(`${value}{enter}`); + break; + case 'date': + cy.get(selector).should('be.visible').click(); + cy.dataCy('null_inputDate').clear().type(`${value}{enter}`); + break; + case 'checkbox': + cy.get(selector).should('be.visible').click().click(); + break; + } + } + + beforeEach(() => { + cy.viewport(1920, 1080); + cy.login('developer'); + cy.visit(url); + cy.typeSearchbar('{enter}'); + }); + + after(() => { + cy.visit(url); + cy.typeSearchbar('{enter}'); + cy.get(selectors.lastRowSelectCheckBox).click(); + + cy.get(selectors.removeBtn).click(); + cy.dataCy(selectors.confirmBtn).click(); + }); + + it('Should list routes', () => { + cy.get('.q-table') + .children() + .should('be.visible') + .should('have.length.greaterThan', 0); + }); + + it('Should create new route', () => { + cy.addBtnClick(); + + const data = { + Worker: { val: 'logistic', type: 'select' }, + Agency: { val: 'Super-Man delivery', type: 'select' }, + Vehicle: { val: '3333-IMK', type: 'select' }, + Date: { val: '02-01-2024', type: 'date' }, + From: { val: '01-01-2024', type: 'date' }, + To: { val: '10-01-2024', type: 'date' }, + 'Km start': { val: 1000 }, + 'Km end': { val: 1200 }, + Description: { val: 'Test route' }, + }; + + cy.fillInForm(data); + + cy.dataCy(selectors.saveFormBtn).click(); + cy.checkNotification(dataCreated); + cy.url().should('include', '/summary'); + }); + + it('Should reset changed values when click reset button', () => { + updateFields.forEach(({ selector, type, value }) => { + fillField(selector, type, value); + }); + + cy.get('[title="Reset"]').click(); + + originalFields.forEach(({ selector, value }) => { + cy.validateContent(selector, value); + }); + }); + + it('Should clone selected route', () => { + cy.get(selectors.lastRowSelectCheckBox).click(); + cy.get(selectors.cloneBtn).click(); + cy.dataCy('route.Starting date_inputDate').type('10-05-2001{enter}'); + cy.get('.q-card__actions > .q-btn--standard > .q-btn__content').click(); + cy.validateContent(selectors.date, '05/10/2001'); + }); + + it('Should download selected route', () => { + const downloadsFolder = Cypress.config('downloadsFolder'); + cy.get(selectors.lastRowSelectCheckBox).click(); + cy.get(selectors.downloadBtn).click(); + cy.wait(5000); + + const fileName = 'download.zip'; + cy.readFile(`${downloadsFolder}/${fileName}`).should('exist'); + + cy.task('deleteFile', `${downloadsFolder}/${fileName}`).then((deleted) => { + expect(deleted).to.be.true; + }); + }); + + it('Should mark as served the selected route', () => { + cy.get(selectors.lastRowSelectCheckBox).click(); + cy.get(selectors.markServedBtn).click(); + + cy.typeSearchbar('{enter}'); + cy.validateContent(selectors.served, checkboxState.check); + }); + + it('Should delete the selected route', () => { + cy.get(selectors.lastRowSelectCheckBox).click(); + + cy.get(selectors.removeBtn).click(); + cy.dataCy(selectors.confirmBtn).click(); + + cy.checkNotification(dataSaved); + }); + + it('Should save changes in route', () => { + updateFields.forEach(({ selector, type, value }) => { + fillField(selector, type, value); + }); + + cy.dataCy(selectors.saveBtn).should('not.be.disabled').click(); + cy.checkNotification(dataSaved); + + cy.typeSearchbar('{enter}'); + + updateFields.forEach(({ selector, value }) => { + cy.validateContent(selector, value); + }); + }); + + it('Should add ticket to route', () => { + cy.dataCy('tableAction-0').last().click(); + cy.get(selectors.firstTicketsRowSelectCheckBox).click(); + cy.get('.q-card__actions > .q-btn--standard > .q-btn__content').click(); + cy.checkNotification(dataSaved); + }); + + it('Should open summary pop-up when click summuary icon', () => { + cy.dataCy('tableAction-1').last().click(); + cy.get('.summaryHeader > :nth-child(2').should('contain', updateFields[4].value); + }); + + it('Should redirect to the summary from the route summary pop-up', () => { + cy.dataCy('tableAction-1').last().click(); + cy.get('.header > .q-icon').should('be.visible').click(); + cy.url().should('include', '/summary'); + }); + + it('Should redirect to the summary when click go to summary icon', () => { + cy.dataCy('tableAction-2').last().click(); + cy.url().should('include', '/summary'); + }); +}); diff --git a/test/cypress/integration/ticket/ticketSale.spec.js b/test/cypress/integration/ticket/ticketSale.spec.js index aed8dc85ac2..63562bd26e9 100644 --- a/test/cypress/integration/ticket/ticketSale.spec.js +++ b/test/cypress/integration/ticket/ticketSale.spec.js @@ -1,122 +1,208 @@ /// <reference types="cypress" /> describe('TicketSale', () => { - beforeEach(() => { - cy.login('developer'); - cy.viewport(1920, 1080); - cy.visit('/#/ticket/31/sale'); - }); - - const firstRow = 'tbody > :nth-child(1)'; - - const selectFirstRow = () => { - cy.waitForElement(firstRow); - cy.get(firstRow).find('.q-checkbox__inner').click(); - }; - - it('it should add item to basket', () => { - cy.window().then((win) => { - cy.stub(win, 'open').as('windowOpen'); + describe('Free ticket #31', () => { + beforeEach(() => { + cy.login('developer'); + cy.viewport(1920, 1080); + cy.visit('/#/ticket/31/sale'); }); - cy.dataCy('ticketSaleAddToBasketBtn').should('exist'); - cy.dataCy('ticketSaleAddToBasketBtn').click(); - cy.get('@windowOpen').should('be.calledWithMatch', /\/order\/\d+\/catalog/); - }); - it('should send SMS', () => { - selectFirstRow(); - cy.dataCy('ticketSaleMoreActionsDropdown').click(); - cy.waitForElement('[data-cy="sendShortageSMSItem"]'); - cy.dataCy('sendShortageSMSItem').should('exist'); - cy.dataCy('sendShortageSMSItem').click(); - cy.dataCy('vnSmsDialog').should('exist'); - cy.dataCy('sendSmsBtn').click(); - cy.checkNotification('SMS sent'); - }); + const firstRow = 'tbody > :nth-child(1)'; - it('should recalculate price when "Recalculate price" is clicked', () => { - cy.intercept('POST', '**/recalculatePrice').as('recalculatePrice'); - selectFirstRow(); - cy.dataCy('ticketSaleMoreActionsDropdown').click(); - cy.waitForElement('[data-cy="recalculatePriceItem"]'); - cy.dataCy('recalculatePriceItem').should('exist'); - cy.dataCy('recalculatePriceItem').click(); - cy.wait('@recalculatePrice').its('response.statusCode').should('eq', 200); - cy.checkNotification('Data saved'); - }); + const selectFirstRow = () => { + cy.waitForElement(firstRow); + cy.get(firstRow).find('.q-checkbox__inner').click(); + }; - it('should update discount when "Update discount" is clicked', () => { - selectFirstRow(); - cy.dataCy('ticketSaleMoreActionsDropdown').click(); - cy.waitForElement('[data-cy="updateDiscountItem"]'); - cy.dataCy('updateDiscountItem').should('exist'); - cy.dataCy('updateDiscountItem').click(); - cy.waitForElement('[data-cy="ticketSaleDiscountInput"]'); - cy.dataCy('ticketSaleDiscountInput').find('input').focus(); - cy.dataCy('ticketSaleDiscountInput').find('input').type('10'); - cy.dataCy('saveManaBtn').click(); - cy.waitForElement('.q-notification__message'); - cy.checkNotification('Data saved'); - }); + it('it should add item to basket', () => { + cy.window().then((win) => { + cy.stub(win, 'open').as('windowOpen'); + }); + cy.dataCy('ticketSaleAddToBasketBtn').should('exist'); + cy.dataCy('ticketSaleAddToBasketBtn').click(); + cy.get('@windowOpen').should('be.calledWithMatch', /\/order\/\d+\/catalog/); + }); - it('adds claim', () => { - selectFirstRow(); - cy.dataCy('ticketSaleMoreActionsDropdown').click(); - cy.dataCy('createClaimItem').click(); - cy.dataCy('VnConfirm_confirm').click(); - cy.url().should('contain', 'claim/'); - // Delete created claim to avoid cluttering the database - cy.dataCy('descriptor-more-opts').click(); - cy.dataCy('deleteClaim').click(); - cy.dataCy('VnConfirm_confirm').click(); - cy.checkNotification('Data deleted'); - }); + it('should send SMS', () => { + selectFirstRow(); + cy.dataCy('ticketSaleMoreActionsDropdown').click(); + cy.waitForElement('[data-cy="sendShortageSMSItem"]'); + cy.dataCy('sendShortageSMSItem').should('exist'); + cy.dataCy('sendShortageSMSItem').click(); + cy.dataCy('vnSmsDialog').should('exist'); + cy.dataCy('sendSmsBtn').click(); + cy.checkNotification('SMS sent'); + }); - it('marks row as reserved', () => { - selectFirstRow(); - cy.dataCy('ticketSaleMoreActionsDropdown').click(); - cy.waitForElement('[data-cy="markAsReservedItem"]'); - cy.dataCy('markAsReservedItem').click(); - cy.dataCy('ticketSaleReservedIcon').should('exist'); - }); + it('should recalculate price when "Recalculate price" is clicked', () => { + cy.intercept('POST', '**/recalculatePrice').as('recalculatePrice'); + selectFirstRow(); + cy.dataCy('ticketSaleMoreActionsDropdown').click(); + cy.waitForElement('[data-cy="recalculatePriceItem"]'); + cy.dataCy('recalculatePriceItem').should('exist'); + cy.dataCy('recalculatePriceItem').click(); + cy.wait('@recalculatePrice').its('response.statusCode').should('eq', 200); + cy.checkNotification('Data saved'); + }); - it('unmarks row as reserved', () => { - selectFirstRow(); - cy.dataCy('ticketSaleMoreActionsDropdown').click(); - cy.waitForElement('[data-cy="unmarkAsReservedItem"]'); - cy.dataCy('unmarkAsReservedItem').click(); - cy.dataCy('ticketSaleReservedIcon').should('not.exist'); - }); + it('should update discount when "Update discount" is clicked', () => { + selectFirstRow(); + cy.dataCy('ticketSaleMoreActionsDropdown').click(); + cy.waitForElement('[data-cy="updateDiscountItem"]'); + cy.dataCy('updateDiscountItem').should('exist'); + cy.dataCy('updateDiscountItem').click(); + cy.waitForElement('[data-cy="ticketSaleDiscountInput"]'); + cy.dataCy('ticketSaleDiscountInput').find('input').focus(); + cy.dataCy('ticketSaleDiscountInput').find('input').type('10'); + cy.dataCy('saveManaBtn').click(); + cy.waitForElement('.q-notification__message'); + cy.checkNotification('Data saved'); + }); - it('refunds row with warehouse', () => { - selectFirstRow(); - cy.dataCy('ticketSaleMoreActionsDropdown').click(); - cy.dataCy('ticketSaleRefundItem').click(); - cy.dataCy('ticketSaleRefundWithWarehouse').click(); - cy.checkNotification('The following refund ticket have been created'); - }); + it('adds claim', () => { + selectFirstRow(); + cy.dataCy('ticketSaleMoreActionsDropdown').click(); + cy.dataCy('createClaimItem').click(); + cy.dataCy('VnConfirm_confirm').click(); + cy.url().should('contain', 'claim/'); + // Delete created claim to avoid cluttering the database + cy.dataCy('descriptor-more-opts').click(); + cy.dataCy('deleteClaim').click(); + cy.dataCy('VnConfirm_confirm').click(); + cy.checkNotification('Data deleted'); + }); - it('refunds row without warehouse', () => { - selectFirstRow(); - cy.dataCy('ticketSaleMoreActionsDropdown').click(); - cy.dataCy('ticketSaleRefundItem').click(); - cy.dataCy('ticketSaleRefundWithoutWarehouse').click(); - cy.checkNotification('The following refund ticket have been created'); - }); + it('marks row as reserved', () => { + selectFirstRow(); + cy.dataCy('ticketSaleMoreActionsDropdown').click(); + cy.waitForElement('[data-cy="markAsReservedItem"]'); + cy.dataCy('markAsReservedItem').click(); + cy.dataCy('ticketSaleReservedIcon').should('exist'); + }); - it('transfer sale to a new ticket', () => { - cy.visit('/#/ticket/32/sale'); - cy.get('.q-item > .q-item__label').should('have.text', ' #32'); - selectFirstRow(); - cy.dataCy('ticketSaleTransferBtn').click(); - cy.dataCy('ticketTransferPopup').should('exist'); - cy.dataCy('ticketTransferNewTicketBtn').click(); - //check the new ticket has been created succesfully - cy.get('.q-item > .q-item__label').should('not.have.text', ' #32'); - }); + it('unmarks row as reserved', () => { + selectFirstRow(); + cy.dataCy('ticketSaleMoreActionsDropdown').click(); + cy.waitForElement('[data-cy="unmarkAsReservedItem"]'); + cy.dataCy('unmarkAsReservedItem').click(); + cy.dataCy('ticketSaleReservedIcon').should('not.exist'); + }); - it('should redirect to ticket logs', () => { - cy.get(firstRow).find('.q-btn:last').click(); - cy.url().should('match', /\/ticket\/31\/log/); + it('refunds row with warehouse', () => { + selectFirstRow(); + cy.dataCy('ticketSaleMoreActionsDropdown').click(); + cy.dataCy('ticketSaleRefundItem').click(); + cy.dataCy('ticketSaleRefundWithWarehouse').click(); + cy.checkNotification('The following refund ticket have been created'); + }); + + it('refunds row without warehouse', () => { + selectFirstRow(); + cy.dataCy('ticketSaleMoreActionsDropdown').click(); + cy.dataCy('ticketSaleRefundItem').click(); + cy.dataCy('ticketSaleRefundWithoutWarehouse').click(); + cy.checkNotification('The following refund ticket have been created'); + }); + + it('transfer sale to a new ticket', () => { + cy.visit('/#/ticket/32/sale'); + cy.get('.q-item > .q-item__label').should('have.text', ' #32'); + selectFirstRow(); + cy.dataCy('ticketSaleTransferBtn').click(); + cy.dataCy('ticketTransferPopup').should('exist'); + cy.dataCy('ticketTransferNewTicketBtn').click(); + //check the new ticket has been created succesfully + cy.get('.q-item > .q-item__label').should('not.have.text', ' #32'); + }); + + it('should redirect to ticket logs', () => { + cy.get(firstRow).find('.q-btn:last').click(); + cy.url().should('match', /\/ticket\/31\/log/); + }); + }); + describe('Ticket prepared #23', () => { + beforeEach(() => { + cy.login('developer'); + cy.viewport(1920, 1080); + cy.visit('/#/ticket/23/sale'); + }); + + const firstRow = 'tbody > :nth-child(1)'; + + const selectFirstRow = () => { + cy.waitForElement(firstRow); + cy.get(firstRow).find('.q-checkbox__inner').click(); + }; + + it('update price', () => { + const price = Number((Math.random() * 99 + 1).toFixed(2)); + cy.waitForElement(firstRow); + cy.get(':nth-child(10) > .q-btn').click(); + cy.waitForElement('[data-cy="ticketEditManaProxy"]'); + cy.dataCy('ticketEditManaProxy').should('exist'); + cy.waitForElement('[data-cy="Price_input"]'); + cy.dataCy('Price_input').clear(); + cy.dataCy('Price_input').type(price); + cy.dataCy('saveManaBtn').click(); + handleVnConfirm(); + + cy.get(':nth-child(10) > .q-btn > .q-btn__content').should( + 'have.text', + `โฌ${price}`, + ); + }); + it('update dicount', () => { + const discount = Math.floor(Math.random() * 100) + 1; + selectFirstRow(); + cy.get(':nth-child(11) > .q-btn').click(); + cy.waitForElement('[data-cy="ticketEditManaProxy"]'); + cy.dataCy('ticketEditManaProxy').should('exist'); + cy.waitForElement('[data-cy="Disc_input"]'); + cy.dataCy('Disc_input').clear(); + cy.dataCy('Disc_input').type(discount); + cy.dataCy('saveManaBtn').click(); + handleVnConfirm(); + + cy.get(':nth-child(11) > .q-btn > .q-btn__content').should( + 'have.text', + `${discount}.00%`, + ); + }); + + it('change concept', () => { + const quantity = Math.floor(Math.random() * 100) + 1; + cy.waitForElement(firstRow); + cy.get(':nth-child(8) > .row').click(); + cy.get( + '.q-menu > [data-v-ca3f07a4=""] > .q-field > .q-field__inner > .q-field__control > .q-field__control-container > [data-cy="undefined_input"]', + ) + .type(quantity) + .type('{enter}'); + handleVnConfirm(); + + cy.get(':nth-child(8) >.row').should('contain.text', `${quantity}`); + }); + it('changequantity ', () => { + const quantity = Math.floor(Math.random() * 100) + 1; + cy.waitForElement(firstRow); + cy.dataCy('ticketSaleQuantityInput').clear(); + cy.dataCy('ticketSaleQuantityInput').type(quantity).trigger('tab'); + cy.get('.q-page > :nth-child(6)').click(); + + handleVnConfirm(); + + cy.get('[data-cy="ticketSaleQuantityInput"]') + .find('[data-cy="undefined_input"]') + .should('have.value', `${quantity}`); + }); }); }); + +function handleVnConfirm() { + cy.get('[data-cy="VnConfirm_confirm"] > .q-btn__content > .block').click(); + cy.waitForElement('.q-notification__message'); + + cy.get('.q-notification__message').should('be.visible'); + cy.checkNotification('Data saved'); +} diff --git a/test/cypress/integration/wagon/wagonType/wagonTypeCreate.spec.js b/test/cypress/integration/wagon/wagonType/wagonTypeCreate.spec.js index 2cd43984a5a..49d7d9f01e4 100644 --- a/test/cypress/integration/wagon/wagonType/wagonTypeCreate.spec.js +++ b/test/cypress/integration/wagon/wagonType/wagonTypeCreate.spec.js @@ -8,7 +8,7 @@ describe('WagonTypeCreate', () => { it('should create a new wagon type and then delete it', () => { cy.get('.q-page-sticky > div > .q-btn').click(); - cy.get('input').first().type('Example for testing'); + cy.dataCy('Name_input').type('Example for testing'); cy.get('[data-cy="FormModelPopup_save"]').click(); cy.get('[title="Remove"] > .q-btn__content > .q-icon').first().click(); }); diff --git a/test/cypress/integration/worker/workerCreate.spec.js b/test/cypress/integration/worker/workerCreate.spec.js index 7f2810395ed..71fd6b347e7 100644 --- a/test/cypress/integration/worker/workerCreate.spec.js +++ b/test/cypress/integration/worker/workerCreate.spec.js @@ -2,9 +2,24 @@ describe('WorkerCreate', () => { const externalRadio = '.q-radio:nth-child(2)'; const developerBossId = 120; const payMethodCross = - '.grid-create .full-width > :nth-child(9) .q-select .q-field__append:not(.q-anchor--skip)'; + ':nth-child(9) > .q-select > .q-field__inner > .q-field__control > :nth-child(2)'; const saveBtn = '.q-mt-lg > .q-btn--standard'; + const internalWithOutPay = { + Fi: { val: '78457139E' }, + 'Web user': { val: 'manolo' }, + Name: { val: 'Manolo' }, + 'Last name': { val: 'Hurtado' }, + 'Personal email': { val: 'manolo@mydomain.com' }, + Company: { val: 'VNL', type: 'select' }, + Street: { val: 'S/ DEFAULTWORKERSTREET' }, + Location: { val: 1, type: 'select' }, + Phone: { val: '123456789' }, + 'Worker code': { val: 'DWW' }, + Boss: { val: developerBossId, type: 'select' }, + Birth: { val: '11-12-2022', type: 'date' }, + }; + const internal = { Fi: { val: '78457139E' }, 'Web user': { val: 'manolo' }, @@ -14,6 +29,7 @@ describe('WorkerCreate', () => { Company: { val: 'VNL', type: 'select' }, Street: { val: 'S/ DEFAULTWORKERSTREET' }, Location: { val: 1, type: 'select' }, + 'Pay method': { val: 1, type: 'select' }, Phone: { val: '123456789' }, 'Worker code': { val: 'DWW' }, Boss: { val: developerBossId, type: 'select' }, @@ -37,17 +53,14 @@ describe('WorkerCreate', () => { }); it('should throw an error if a pay method has not been selected', () => { - cy.fillInForm(internal); + cy.fillInForm(internalWithOutPay); cy.get(payMethodCross).click(); cy.get(saveBtn).click(); cy.checkNotification('Payment method is required'); }); it('should create an internal', () => { - cy.fillInForm({ - ...internal, - 'Pay method': { val: 'PayMethod one', type: 'select' }, - }); + cy.fillInForm(internal); cy.get(saveBtn).click(); cy.checkNotification('Data created'); }); diff --git a/test/cypress/integration/worker/workerNotificationsManager.spec.js b/test/cypress/integration/worker/workerNotificationsManager.spec.js index f121b3894f8..ad48d8a6cb2 100644 --- a/test/cypress/integration/worker/workerNotificationsManager.spec.js +++ b/test/cypress/integration/worker/workerNotificationsManager.spec.js @@ -18,7 +18,7 @@ describe('WorkerNotificationsManager', () => { cy.visit(`/#/worker/${salesPersonId}/notifications`); cy.get(firstAvailableNotification).click(); cy.checkNotification( - 'The notification subscription of this worker cant be modified' + 'The notification subscription of this worker cant be modified', ); }); diff --git a/test/cypress/integration/worker/workerPit.spec.js b/test/cypress/integration/worker/workerPit.spec.js index cc3a87637a6..19cbebc204f 100644 --- a/test/cypress/integration/worker/workerPit.spec.js +++ b/test/cypress/integration/worker/workerPit.spec.js @@ -8,7 +8,8 @@ describe('WorkerPit', () => { const spousePensionInput = '[data-cy="Spouse Pension_input"]'; const spousePension = '120'; const addRelative = '[data-cy="addRelative"]'; - const isDescendantSelect = '[data-cy="Descendant/Ascendant_select"]'; + const isDescendantSelect = '[data-cy="Descendant/Ascendant"]'; + const Descendant = 'Descendiente'; const birthedInput = '[data-cy="Birth Year_input"]'; const birthed = '2002'; const adoptionYearInput = '[data-cy="Adoption Year_input"]'; @@ -28,11 +29,8 @@ describe('WorkerPit', () => { cy.get(spouseNifInput).type(spouseNif); cy.get(spousePensionInput).type(spousePension); cy.get(savePIT).click(); - }); - - it('complete relative', () => { cy.get(addRelative).click(); - cy.get(isDescendantSelect).type('{downArrow}{downArrow}{enter}'); + cy.get(isDescendantSelect).type(Descendant); cy.get(birthedInput).type(birthed); cy.get(adoptionYearInput).type(adoptionYear); cy.get(saveRelative).click(); diff --git a/test/cypress/integration/zone/zoneList.spec.js b/test/cypress/integration/zone/zoneList.spec.js index 8d01d4e4e8f..68e92463540 100644 --- a/test/cypress/integration/zone/zoneList.spec.js +++ b/test/cypress/integration/zone/zoneList.spec.js @@ -1,4 +1,5 @@ describe('ZoneList', () => { + const agency = 'inhouse pickup'; beforeEach(() => { cy.viewport(1280, 720); cy.login('developer'); @@ -6,11 +7,15 @@ describe('ZoneList', () => { }); it('should filter by agency', () => { - cy.get('input[aria-label="Agency"]').type('{downArrow}{enter}'); + cy.dataCy('zoneFilterPanelNameInput').type('{downArrow}{enter}'); }); it('should open the zone summary', () => { - cy.get('input[aria-label="Name"]').type('zone refund'); - cy.get('.q-scrollarea__content > .q-btn--standard > .q-btn__content').click(); + cy.dataCy('zoneFilterPanelAgencySelect').type(agency); + cy.get('.q-menu .q-item').contains(agency).click(); + cy.get(':nth-child(1) > [data-col-field="agencyModeFk"]').should( + 'include.text', + agency, + ); }); });