PluginProbe ʕ •ᴥ•ʔ
Booking for Appointments and Events Calendar – Amelia / 2.4.4
Booking for Appointments and Events Calendar – Amelia v2.4.4
2.4.4 2.4.3 2.4.2 2.4.1 2.4 trunk 1.2.1 1.2.10 1.2.11 1.2.12 1.2.13 1.2.14 1.2.15 1.2.16 1.2.17 1.2.18 1.2.19 1.2.2 1.2.20 1.2.21 1.2.22 1.2.23 1.2.24 1.2.25 1.2.26 1.2.27 1.2.28 1.2.29 1.2.3 1.2.30 1.2.31 1.2.32 1.2.33 1.2.34 1.2.35 1.2.36 1.2.37 1.2.38 1.2.4 1.2.5 1.2.6 1.2.7 1.2.8 1.2.9 2.0 2.0.1 2.0.2 2.1 2.1.1 2.1.2 2.1.3 2.2 2.2.1 2.3
ameliabooking / v3 / src / store / modules / entities.js
ameliabooking / v3 / src / store / modules Last commit date
appointment.js 2 days ago appointmentWaitingListOptions.js 2 days ago attendee.js 2 days ago auth.js 2 days ago bookableType.js 2 days ago booking.js 2 days ago cabinet.js 2 days ago cabinetFilters.js 2 days ago coupon.js 2 days ago customFields.js 2 days ago customerInfo.js 2 days ago employee.js 2 days ago entities.js 2 days ago event.js 2 days ago eventBooking.js 2 days ago eventEntities.js 2 days ago eventWaitingListOptions.js 2 days ago pagination.js 2 days ago params.js 2 days ago payment.js 2 days ago persons.js 2 days ago recurring.js 2 days ago shortcodeParams.js 2 days ago stepByStepFilters.js 2 days ago tickets.js 2 days ago
entities.js
1093 lines
1 import httpClient from '../../plugins/axios.js'
2 import { settings, shortLocale, longLocale } from '../../plugins/settings.js'
3 import { useUrlParams, useUrlQueryParams } from '../../assets/js/common/helper'
4 import { getBadgeTranslated, useTranslateEntities } from '../../assets/js/public/translation'
5 import { useFeaturesAndIntegrations, useParsedCustomPricing } from '../../assets/js/common/employee'
6
7 function isEmployeeServiceLocation(relations, employeeId, serviceId, locationId = null) {
8 if (locationId) {
9 return (
10 employeeId in relations &&
11 serviceId in relations[employeeId] &&
12 relations[employeeId][serviceId].indexOf(locationId) !== -1
13 )
14 }
15
16 return employeeId in relations && serviceId in relations[employeeId]
17 }
18
19 function setLiteService() {
20 return {
21 extras: [],
22 maxCapacity: 1,
23 minCapacity: 1,
24 timeAfter: '',
25 timeBefore: '',
26 bringingAnyone: false,
27 aggregatedPrice: true,
28 settings: null,
29 recurringCycle: 'disabled',
30 recurringSub: 'future',
31 recurringPayment: 0,
32 deposit: 0,
33 depositPayment: 'disabled',
34 depositPerPerson: 1,
35 fullPayment: false,
36 translations: null,
37 minSelectedExtras: null,
38 mandatoryExtra: false,
39 }
40 }
41
42 function setStarterService() {
43 return {
44 timeAfter: '',
45 timeBefore: '',
46 deposit: 0,
47 depositPayment: 'disabled',
48 depositPerPerson: 1,
49 fullPayment: false,
50 translations: null,
51 }
52 }
53
54 function useLiteEntities(entities) {
55 entities.categories.forEach((category, categoryIndex) => {
56 category.serviceList.forEach((service, serviceIndex) => {
57 entities.categories[categoryIndex].serviceList[serviceIndex] = Object.assign(
58 service,
59 setLiteService(),
60 )
61 })
62 })
63
64 entities.employees.forEach((employee, employeeIndex) => {
65 employee.serviceList.forEach((service, serviceIndex) => {
66 entities.employees[employeeIndex].serviceList[serviceIndex] = Object.assign(
67 service,
68 setLiteService(),
69 )
70 })
71 })
72
73 entities.packages = []
74 entities.locations = []
75 entities.customFields = []
76
77 return entities
78 }
79
80 function useStarterEntities(entities) {
81 entities.categories.forEach((category, categoryIndex) => {
82 category.serviceList.forEach((service, serviceIndex) => {
83 entities.categories[categoryIndex].serviceList[serviceIndex] = Object.assign(
84 service,
85 setStarterService(),
86 )
87 })
88 })
89
90 entities.employees.forEach((employee, employeeIndex) => {
91 employee.serviceList.forEach((service, serviceIndex) => {
92 entities.employees[employeeIndex].serviceList[serviceIndex] = Object.assign(
93 service,
94 setStarterService(),
95 )
96 })
97 })
98
99 entities.packages = []
100 entities.locations = []
101 entities.customFields = []
102
103 return entities
104 }
105
106 function setEntities({ commit, rootState }, entities, types, licence, showHidden, isPanel) {
107 commit('setShowHidden', showHidden)
108
109 let availableTranslationsShort = settings.general.usedLanguages.map((key) =>
110 key.length > 2 ? key.slice(0, 2) : key,
111 )
112
113 if (licence.isLite) {
114 entities = useLiteEntities(entities)
115 }
116
117 if (licence.isStarter) {
118 entities = useStarterEntities(entities)
119 }
120
121 if (
122 settings.general.usedLanguages.indexOf(longLocale) !== -1 ||
123 availableTranslationsShort.indexOf(shortLocale) !== -1
124 ) {
125 useTranslateEntities(entities)
126
127 rootState.settings.roles.providerBadges.badges?.forEach((badge) => {
128 badge.content = getBadgeTranslated(badge)
129 })
130 }
131
132 if (!isPanel && !settings.featuresIntegrations.customFields.enabled) {
133 entities['customFields'] = []
134 }
135
136 if (!isPanel && !settings.featuresIntegrations.packages.enabled) {
137 entities['packages'] = []
138 }
139
140 types.forEach((ent) => {
141 if (!(ent in entities)) {
142 entities[ent] = []
143 }
144
145 if (ent === 'categories') {
146 if (settings.activation.stash) {
147 entities[ent].sort((a, b) => a.position - b.position)
148 }
149
150 entities[ent].forEach((category, categoryIndex) => {
151 if (settings.activation.stash) {
152 category.serviceList.sort((a, b) => a.position - b.position)
153 }
154 category.serviceList.forEach((service, serviceIndex) => {
155 useFeaturesAndIntegrations(service, isPanel)
156
157 useFeaturesAndIntegrations(
158 entities[ent][categoryIndex].serviceList[serviceIndex],
159 isPanel,
160 )
161
162 entities[ent][categoryIndex].serviceList[serviceIndex].customPricing =
163 useParsedCustomPricing(service)
164 })
165 })
166 }
167
168 if (ent === 'employees') {
169 let arr = []
170 entities[ent].forEach((employee, employeeIndex) => {
171 employee.serviceList.forEach((employeeService, serviceIndex) => {
172 let service = entities.categories
173 .find(
174 (c) =>
175 c.serviceList.filter((s) => parseInt(s.id) === parseInt(employeeService.id)).length,
176 )
177 .serviceList.find((s) => parseInt(s.id) === parseInt(employeeService.id))
178
179 let employeePrice = entities[ent][employeeIndex].serviceList[serviceIndex].price
180 let employeeMinCapacity =
181 entities[ent][employeeIndex].serviceList[serviceIndex].minCapacity
182 let employeeMaxCapacity =
183 entities[ent][employeeIndex].serviceList[serviceIndex].maxCapacity
184
185 entities[ent][employeeIndex].serviceList[serviceIndex] = JSON.parse(
186 JSON.stringify(service),
187 )
188
189 entities[ent][employeeIndex].serviceList[serviceIndex].price = employeePrice
190 entities[ent][employeeIndex].serviceList[serviceIndex].minCapacity = employeeMinCapacity
191 entities[ent][employeeIndex].serviceList[serviceIndex].maxCapacity = employeeMaxCapacity
192
193 useFeaturesAndIntegrations(
194 entities[ent][employeeIndex].serviceList[serviceIndex],
195 isPanel,
196 )
197
198 useFeaturesAndIntegrations(employeeService, isPanel)
199
200 useFeaturesAndIntegrations(service, isPanel)
201
202 entities[ent][employeeIndex].serviceList[serviceIndex].customPricing =
203 useParsedCustomPricing(employeeService.customPricing ? employeeService : service)
204 })
205
206 if (employee.badgeId) {
207 employee.badge = rootState.settings.roles.providerBadges.badges?.find(
208 (badge) => badge.id === employee.badgeId,
209 )
210 } else {
211 employee.badge = null
212 }
213
214 if (showHidden || (employee.status !== 'hidden' && employee.show)) {
215 arr.push(employee)
216 }
217 })
218 commit('setUnfilteredEmployees', arr)
219 }
220
221 if (ent === 'locations') {
222 let arr = []
223 entities[ent].forEach((location) => {
224 if (showHidden || location.status !== 'hidden') {
225 arr.push(location)
226 }
227 })
228 commit('setUnfilteredLocations', arr)
229 }
230
231 commit(
232 'set' + ent.charAt(0).toUpperCase() + ent.slice(1),
233 ent === 'customFields'
234 ? entities['customFields'].sort(function (a, b) {
235 if (a['saveType'] === b['saveType']) {
236 return a['position'] - b['position']
237 }
238 return a['saveType'].localeCompare(b['saveType'])
239 })
240 : entities[ent],
241 )
242 })
243
244 commit('setPreselectedFromUrl')
245 commit('setPreselectedValues')
246 commit('setReady', true)
247 }
248
249 function getEntitiesVariableName() {
250 return 'ameliaAppointmentEntities' in window
251 ? 'ameliaAppointmentEntities'
252 : 'ameliaEntities' in window
253 ? 'ameliaEntities'
254 : false
255 }
256
257 export default {
258 namespaced: true,
259
260 state: () => ({
261 settings: [],
262 taxes: [],
263 categories: [],
264 services: [],
265 employees: [],
266 unfilteredEmployees: [],
267 locations: [],
268 unfilteredLocations: [],
269 packages: [],
270 entitiesRelations: {},
271 customFields: [],
272 tags: [],
273 spaces: [],
274 ready: false,
275 showHidden: false,
276 originalPreselected: {},
277 preselected: {},
278 }),
279
280 getters: {
281 getSettings(state) {
282 return state.settings
283 },
284
285 getSpaces(state) {
286 return state.spaces
287 },
288
289 getEntitiesRelations(state) {
290 return state.entitiesRelations
291 },
292
293 getOriginalPreselected(state) {
294 return JSON.parse(JSON.stringify(state.originalPreselected))
295 },
296
297 getPreselected(state) {
298 return state.preselected
299 },
300
301 getTaxes(state) {
302 return state.taxes
303 },
304
305 getTax: (state) => (id) => {
306 return state.taxes.find((i) => parseInt(i.id) === parseInt(id)) || null
307 },
308
309 getCategories(state) {
310 return state.categories
311 },
312
313 getCategory: (state) => (id) => {
314 return state.categories.find((i) => parseInt(i.id) === parseInt(id)) || null
315 },
316
317 getPackages(state) {
318 return state.packages
319 },
320
321 getPackage: (state) => (id) => {
322 return state.packages.find((i) => parseInt(i.id) === parseInt(id)) || null
323 },
324
325 getServices(state) {
326 return state.services
327 },
328
329 getService: (state) => (id) => {
330 return state.services.find((i) => parseInt(i.id) === parseInt(id)) || null
331 },
332
333 getUnfilteredEmployees(state) {
334 return state.unfilteredEmployees
335 },
336
337 getUnfilteredEmployee: (state) => (id) => {
338 return state.unfilteredEmployees.find((a) => parseInt(a.id) === parseInt(id)) || null
339 },
340
341 getEmployees(state) {
342 return state.employees
343 },
344
345 getEmployee: (state) => (id) => {
346 return state.employees.find((i) => parseInt(i.id) === parseInt(id)) || null
347 },
348
349 getEmployeeService: (state) => (providerId, serviceId) => {
350 return state.employees
351 .find((i) => parseInt(i.id) === parseInt(providerId))
352 .serviceList.find((i) => parseInt(i.id) === parseInt(serviceId))
353 },
354
355 getUnfilteredLocations(state) {
356 return state.unfilteredLocations
357 },
358
359 getUnfilteredLocation: (state) => (id) => {
360 return state.unfilteredLocations.find((i) => parseInt(i.id) === parseInt(id)) || null
361 },
362
363 getLocations(state) {
364 return state.locations
365 },
366
367 getLocation: (state) => (id) => {
368 return state.locations.find((i) => parseInt(i.id) === parseInt(id)) || null
369 },
370
371 getTags(state) {
372 return state.tags
373 },
374
375 getCustomFields(state) {
376 return state.customFields
377 },
378
379 getCustomField: (state) => (id) => {
380 return state.customFields.find((i) => parseInt(i.id) === parseInt(id)) || null
381 },
382
383 filteredCategories: (state, getters) => (data) => {
384 let categories = []
385
386 let categoriesIds = getters
387 .filteredServices(data)
388 .filter((service) => !data.serviceId || service.id === data.serviceId)
389 .map((service) => service.categoryId)
390
391 state.categories.forEach((category) => {
392 if (categoriesIds.indexOf(category.id) !== -1) {
393 let availableCategory = Object.assign({}, category)
394 availableCategory.serviceList = getters
395 .filteredServices(data)
396 .filter((service) => service.categoryId === category.id)
397 categories.push(availableCategory)
398 }
399 })
400
401 return categories
402 },
403
404 filteredServices: (state, getters) => (data) => {
405 return state.services.filter(
406 (service) =>
407 (!data.categoryId ? true : service.categoryId === data.categoryId) &&
408 (!data.providerId
409 ? true
410 : isEmployeeServiceLocation(state.entitiesRelations, data.providerId, service.id)) &&
411 (!data.locationId
412 ? true
413 : getters
414 .filteredEmployees(data)
415 .filter((employee) =>
416 isEmployeeServiceLocation(
417 state.entitiesRelations,
418 employee.id,
419 service.id,
420 data.locationId,
421 ),
422 ).length > 0),
423 )
424 },
425
426 filteredPackagesPreselected: (state, getters) => () => {
427 let preselected = getters.getOriginalPreselected
428 return state.packages.filter(
429 (pack) =>
430 (preselected.service.length === 0
431 ? true
432 : pack.bookable.filter((b) =>
433 preselected.service.map((s) => parseInt(s)).includes(b.service.id),
434 ).length > 0) &&
435 (preselected.employee.length === 0
436 ? true
437 : pack.bookable.filter((b) =>
438 b.providers.length
439 ? b.providers.find((p) => preselected.employee.includes(p.id))
440 : preselected.employee
441 .map((e) => parseInt(e))
442 .filter((provider) =>
443 isEmployeeServiceLocation(state.entitiesRelations, provider, b.service.id),
444 ).length > 0,
445 ).length === pack.bookable.length) &&
446 (preselected.category.length === 0
447 ? true
448 : pack.bookable.filter((b) =>
449 preselected.category.map((c) => parseInt(c)).includes(b.service.categoryId),
450 ).length === pack.bookable.length) &&
451 (preselected.location.length === 0
452 ? true
453 : pack.bookable.filter((b) =>
454 b.locations.length
455 ? b.locations.find((l) =>
456 preselected.location.map((l) => parseInt(l)).includes(l.id),
457 )
458 : (b.providers.length > 0 ? b.providers : state.employees).filter(
459 (employee) =>
460 preselected.location
461 .map((l) => parseInt(l))
462 .filter((l) =>
463 isEmployeeServiceLocation(
464 state.entitiesRelations,
465 employee.id,
466 b.service.id,
467 l,
468 ),
469 ).length > 0,
470 ).length > 0,
471 ).length === pack.bookable.length),
472 )
473 },
474
475 filteredPackages: (state, getters) => (data) => {
476 let packagesFiltered = getters.filteredPackagesPreselected()
477
478 return packagesFiltered.filter(
479 (pack) =>
480 (state.showHidden || pack.status === 'visible') &&
481 pack.bookable.length &&
482 pack.available &&
483 (!data.serviceId
484 ? true
485 : pack.bookable.filter((b) => b.service.id === data.serviceId).length > 0) &&
486 (!data.providerId
487 ? true
488 : pack.bookable.filter((b) =>
489 b.providers.length
490 ? b.providers.find((p) => data.providerId === p.id)
491 : isEmployeeServiceLocation(
492 state.entitiesRelations,
493 data.providerId,
494 b.service.id,
495 ),
496 ).length === pack.bookable.length) &&
497 (!data.categoryId
498 ? true
499 : state.originalPreselected.category.length
500 ? pack.bookable.filter((b) => b.service.categoryId === data.categoryId).length ===
501 pack.bookable.length
502 : pack.bookable.filter((b) => b.service.categoryId === data.categoryId).length > 0) &&
503 (!data.locationId
504 ? true
505 : pack.bookable.filter((b) =>
506 b.locations.length
507 ? b.locations.find((l) => data.locationId === l.id)
508 : (b.providers.length > 0 ? b.providers : getters.filteredEmployees(data)).filter(
509 (employee) =>
510 isEmployeeServiceLocation(
511 state.entitiesRelations,
512 employee.id,
513 b.service.id,
514 data.locationId,
515 ),
516 ).length > 0,
517 ).length === pack.bookable.length),
518 )
519 },
520
521 filteredLocations: (state, getters) => (data) => {
522 return state.locations.filter(
523 (location) =>
524 (!data.providerId
525 ? true
526 : state.employees.length
527 ? state.employees
528 .find((i) => i.id === data.providerId)
529 .serviceList.filter((employeeService) => {
530 return (
531 (state.showHidden || employeeService.status === 'visible') &&
532 isEmployeeServiceLocation(
533 state.entitiesRelations,
534 data.providerId,
535 employeeService.id,
536 location.id,
537 )
538 )
539 }).length > 0
540 : false) &&
541 (!data.serviceId || data.packageId
542 ? true
543 : getters
544 .filteredEmployees(data)
545 .find((employee) =>
546 isEmployeeServiceLocation(
547 state.entitiesRelations,
548 employee.id,
549 data.serviceId,
550 location.id,
551 ),
552 ) !== undefined) &&
553 (!data.packageId
554 ? true
555 : state.packages
556 .find((i) => i.id === data.packageId)
557 .bookable.filter((book) => {
558 return book.locations.length
559 ? book.locations.find((l) => l.id === location.id)
560 : getters
561 .filteredEmployees(data)
562 .filter((employee) =>
563 isEmployeeServiceLocation(
564 state.entitiesRelations,
565 employee.id,
566 book.service.id,
567 location.id,
568 ),
569 ).length > 0
570 }).length > 0),
571 )
572 },
573
574 filteredEmployees: (state) => (data) => {
575 return state.employees.filter(
576 (employee) =>
577 employee.serviceList.find(
578 (service) =>
579 (state.showHidden || service.status === 'visible') &&
580 // service.maxCapacity >= data.persons &&
581 (!data.serviceId
582 ? true
583 : isEmployeeServiceLocation(state.entitiesRelations, employee.id, service.id) &&
584 service.id === data.serviceId) &&
585 (!data.locationId
586 ? true
587 : isEmployeeServiceLocation(
588 state.entitiesRelations,
589 employee.id,
590 service.id,
591 data.locationId,
592 )),
593 ) !== undefined,
594 )
595 },
596
597 getServiceEmployees: (state) => (serviceId) => {
598 return state.employees.filter((item) => {
599 return item.serviceList.some((service) => {
600 return parseInt(service.id) === parseInt(serviceId)
601 })
602 })
603 },
604
605 getEmployeeServices: (state, getters) => (data) => {
606 let employeeServices = []
607
608 if (data.serviceId) {
609 let service = getters.getService(data.serviceId)
610 if (data.providerId) {
611 let possibleEmployee = state.employees.find((i) => i.id === data.providerId)
612 if (!possibleEmployee) return {}
613 let employeeService = possibleEmployee.serviceList.filter(
614 (service) => service.id === data.serviceId,
615 )
616 return employeeService.map((eS) =>
617 Object.assign(eS, {
618 bringingAnyone: service.bringingAnyone,
619 aggregatedPrice: service.aggregatedPrice,
620 maxExtraPeople: service.maxExtraPeople,
621 }),
622 )
623 }
624
625 getters.filteredEmployees(data).forEach((employee) => {
626 employee.serviceList.forEach((employeeService) => {
627 if (employeeService.id === data.serviceId) {
628 employeeServices.push(
629 Object.assign(employeeService, {
630 bringingAnyone: service.bringingAnyone,
631 aggregatedPrice: service.aggregatedPrice,
632 maxExtraPeople: service.maxExtraPeople,
633 }),
634 )
635 }
636 })
637 })
638 }
639
640 return employeeServices
641 },
642
643 getBookableFromBookableEntities: (state) => (data) => {
644 switch (data.type) {
645 case 'appointment':
646 return state.services.find((i) => i.id === data.serviceId)
647 case 'package':
648 return state.packages.find((i) => i.id === data.packageId)
649 }
650 },
651
652 getReady(state) {
653 return state.ready
654 },
655
656 getShowHidden(state) {
657 return state.showHidden
658 },
659
660 getPackageEntities: (state, getters) => (packageId) => {
661 let entities = { services: [], providers: [], locations: [], packages: [] }
662 let pack = getters.getPackage(packageId)
663 if (pack) {
664 pack.bookable.forEach((bookable) => {
665 entities.services.push(bookable.service.id)
666 let employees = []
667 if (bookable.providers.length > 0) {
668 employees = bookable.providers.map((p) => p.id)
669 } else {
670 employees = state.employees
671 .filter((e) => e.serviceList.find((s) => s.id === bookable.service.id))
672 .map((e) => e.id)
673 }
674 entities.providers = entities.providers.concat(employees)
675 let locations = []
676 if (bookable.locations.length > 0) {
677 locations = bookable.locations.map((p) => p.id)
678 } else {
679 state.locations.forEach((location) =>
680 employees.forEach((e) => {
681 if (
682 isEmployeeServiceLocation(
683 state.entitiesRelations,
684 e,
685 bookable.service.id,
686 location.id,
687 )
688 ) {
689 locations.push(location.id)
690 }
691 }),
692 )
693 }
694 entities.locations = entities.locations.concat(locations)
695 })
696
697 entities.packages.push(pack.id)
698 }
699 return entities
700 },
701 },
702
703 mutations: {
704 setSettings(state, payload) {
705 state.settings = payload
706 },
707
708 setSpaces(state, payload) {
709 state.spaces = payload
710 },
711
712 setTaxes(state, payload) {
713 state.taxes = payload
714 },
715
716 setCategories(state, payload) {
717 state.categories = payload
718
719 let services = []
720
721 state.categories.forEach((category) => {
722 category.serviceList.forEach((service) => {
723 services.push(service)
724 })
725 })
726
727 state.services = services
728 },
729
730 setUnfilteredEmployees(state, payload) {
731 state.unfilteredEmployees = payload
732 },
733
734 setUnfilteredLocations(state, payload) {
735 state.unfilteredLocations = payload
736 },
737
738 setEmployees(state, payload) {
739 state.employees = payload
740 },
741
742 setLocations(state, payload) {
743 state.locations = payload
744 },
745
746 setTags(state, payload) {
747 state.tags = payload
748 },
749
750 setPackages(state, payload) {
751 payload.forEach((pack) => {
752 let isAvailable = true
753
754 pack.bookable.forEach((book) => {
755 if (!book.service.name) {
756 let service = state.services.find((s) => s.id === book.service.id)
757 if (service) {
758 book.service = service
759 }
760 }
761
762 if (state.showHidden ? false : book.service.status !== 'visible') {
763 isAvailable = false
764 }
765 })
766
767 if (isAvailable) {
768 state.packages.push(pack)
769 }
770 })
771
772 state.packages.sort((a, b) => a.position - b.position)
773 },
774
775 setCustomFields(state, payload) {
776 state.customFields = [...Object.values(payload)]
777 },
778
779 setEntitiesRelations(state, payload) {
780 state.entitiesRelations = payload
781 },
782
783 setReady(state, payload) {
784 state.ready = payload
785 },
786
787 setShowHidden(state, payload) {
788 state.showHidden = payload
789 },
790
791 setPreselected(state, payload) {
792 state.preselected = payload
793 state.preselected = Object.assign({}, state.preselected, {
794 category: Array.isArray(state.preselected.category)
795 ? state.preselected.category
796 : state.preselected.category
797 ? state.preselected.category
798 .toString()
799 .split(',')
800 .map((c) => parseInt(c))
801 : [],
802 service: Array.isArray(state.preselected.service)
803 ? state.preselected.service
804 : state.preselected.service
805 ? state.preselected.service
806 .toString()
807 .split(',')
808 .map((c) => parseInt(c))
809 : [],
810 employee: Array.isArray(state.preselected.employee)
811 ? state.preselected.employee
812 : state.preselected.employee
813 ? state.preselected.employee
814 .toString()
815 .split(',')
816 .map((c) => parseInt(c))
817 : [],
818 location: Array.isArray(state.preselected.location)
819 ? state.preselected.location
820 : state.preselected.location
821 ? state.preselected.location
822 .toString()
823 .split(',')
824 .map((c) => parseInt(c))
825 : [],
826 package: Array.isArray(state.preselected.package)
827 ? state.preselected.package
828 : state.preselected.package
829 ? state.preselected.package
830 .toString()
831 .split(',')
832 .map((c) => parseInt(c))
833 : [],
834 })
835 },
836
837 setPreselectedFromUrl(state) {
838 let urlParameters = useUrlQueryParams(window.location.href)
839 if (urlParameters) {
840 if (urlParameters.ameliaServiceId) {
841 state.preselected.service = urlParameters.ameliaServiceId
842 .split(',')
843 .map((a) => parseInt(a))
844 }
845 if (urlParameters.ameliaEmployeeId) {
846 state.preselected.employee = urlParameters.ameliaEmployeeId
847 .split(',')
848 .map((a) => parseInt(a))
849 }
850 if (urlParameters.ameliaLocationId) {
851 state.preselected.location = urlParameters.ameliaLocationId
852 .split(',')
853 .map((a) => parseInt(a))
854 }
855 if (urlParameters.ameliaCategoryId) {
856 state.preselected.category = urlParameters.ameliaCategoryId
857 .split(',')
858 .map((a) => parseInt(a))
859 }
860 }
861 },
862
863 setPreselectedValues(state) {
864 state.originalPreselected = JSON.parse(JSON.stringify(state.preselected))
865
866 state.employees = state.employees.filter(
867 (e) => state.showHidden || (e.status === 'visible' && e.show),
868 )
869 state.services = state.services.filter(
870 (s) =>
871 (state.showHidden ? true : s.status === 'visible' && s.show) &&
872 state.employees.filter((e) => e.serviceList.find((eS) => eS.id === s.id)).length,
873 )
874 state.locations = state.locations.filter((l) => state.showHidden || l.status === 'visible')
875
876 if (!state.showHidden) {
877 state.employees.forEach((e) => {
878 if (!e.show) {
879 delete state.entitiesRelations[e.id]
880 }
881 })
882 }
883
884 if ('category' in state.preselected && state.preselected.category.length > 0) {
885 state.categories = state.categories.filter((c) =>
886 state.preselected.category.map((id) => parseInt(id)).includes(c.id),
887 )
888 state.services = state.services.filter((s) =>
889 state.preselected.category.map((id) => parseInt(id)).includes(s.categoryId),
890 )
891 state.employees = state.employees.filter(
892 (e) =>
893 e.serviceList.filter((s) =>
894 state.preselected.category.map((id) => parseInt(id)).includes(s.categoryId),
895 ).length > 0,
896 )
897 state.locations = state.locations.filter(
898 (l) =>
899 state.employees.filter(
900 (e) =>
901 state.services.filter(
902 (s) =>
903 isEmployeeServiceLocation(state.entitiesRelations, e.id, s.id, l.id) &&
904 state.preselected.category.map((id) => parseInt(id)).includes(s.categoryId),
905 ).length > 0,
906 ).length > 0,
907 )
908 }
909
910 if ('service' in state.preselected && state.preselected.service.length > 0) {
911 state.services = state.services.filter((s) =>
912 state.preselected.service.map((id) => parseInt(id)).includes(s.id),
913 )
914 state.categories = state.categories.filter((c) =>
915 state.services.map((serv) => serv.categoryId).includes(c.id),
916 )
917 state.employees = state.employees.filter(
918 (e) =>
919 e.serviceList.filter((s) =>
920 state.preselected.service.map((id) => parseInt(id)).includes(s.id),
921 ).length > 0,
922 )
923 state.locations = state.locations.filter(
924 (l) =>
925 state.employees.filter(
926 (e) =>
927 state.preselected.service.filter((serviceId) =>
928 isEmployeeServiceLocation(
929 state.entitiesRelations,
930 e.id,
931 parseInt(serviceId),
932 l.id,
933 ),
934 ).length > 0,
935 ).length > 0,
936 )
937 }
938
939 if ('employee' in state.preselected && state.preselected.employee.length > 0) {
940 state.employees = state.employees.filter((e) =>
941 state.preselected.employee.map((id) => parseInt(id)).includes(e.id),
942 )
943 if (state.employees.length > 0) {
944 state.services = state.services.filter(
945 (s) =>
946 state.employees.filter(
947 (e) => e.serviceList.filter((serv) => serv.id === s.id).length > 0,
948 ).length > 0,
949 )
950
951 state.categories = state.categories.filter(
952 (c) => state.services.filter((s) => s.categoryId === c.id).length > 0,
953 )
954 state.locations = state.locations.filter(
955 (l) =>
956 state.services.filter(
957 (s) =>
958 state.preselected.employee.filter((employeeId) =>
959 isEmployeeServiceLocation(
960 state.entitiesRelations,
961 parseInt(employeeId),
962 s.id,
963 l.id,
964 ),
965 ).length > 0,
966 ).length > 0,
967 )
968 }
969 }
970
971 if ('location' in state.preselected && state.preselected.location.length > 0) {
972 state.locations = state.locations.filter((e) =>
973 state.preselected.location.map((id) => parseInt(id)).includes(e.id),
974 )
975 state.employees = state.employees.filter(
976 (e) =>
977 e.serviceList.filter(
978 (s) =>
979 state.preselected.location.filter((locationId) =>
980 isEmployeeServiceLocation(
981 state.entitiesRelations,
982 e.id,
983 s.id,
984 parseInt(locationId),
985 ),
986 ).length > 0,
987 ).length > 0,
988 )
989 state.services = state.services.filter(
990 (s) =>
991 state.employees.filter(
992 (e) => e.serviceList.filter((serv) => serv.id === s.id).length > 0,
993 ).length > 0,
994 )
995 state.categories = state.categories.filter(
996 (c) => state.services.filter((s) => s.categoryId === c.id).length > 0,
997 )
998 }
999
1000 if ('package' in state.preselected && state.preselected.package.length > 0) {
1001 state.packages = state.packages.filter((p) =>
1002 state.preselected.package.map((id) => parseInt(id)).includes(p.id),
1003 )
1004 state.preselected.show = 'packages'
1005 state.services = state.services.filter(
1006 (s) =>
1007 state.packages.filter((p) => p.bookable.filter((b) => b.service.id === s.id).length > 0)
1008 .length > 0,
1009 )
1010 state.categories = state.categories.filter(
1011 (c) => state.services.filter((s) => s.categoryId === c.id).length > 0,
1012 )
1013 }
1014
1015 if (state.services.length === 1 && state.preselected.show !== 'packages') {
1016 state.preselected = Object.assign({}, state.preselected, {
1017 service: [state.services[0].id.toString()],
1018 })
1019 }
1020 if (state.categories.length === 1 && state.preselected.show !== 'packages') {
1021 state.preselected = Object.assign({}, state.preselected, {
1022 category: [state.categories[0].id.toString()],
1023 })
1024 }
1025 if (state.employees.length === 1 && state.preselected.show !== 'packages') {
1026 state.preselected = Object.assign({}, state.preselected, {
1027 employee: [state.employees[0].id.toString()],
1028 })
1029 }
1030 if (state.locations.length === 1 && state.preselected.show !== 'packages') {
1031 state.preselected = Object.assign({}, state.preselected, {
1032 location: [state.locations[0].id.toString()],
1033 })
1034 }
1035
1036 // if all employees have the same price
1037 state.services.forEach((s) => {
1038 let services = state.employees
1039 .map((e) => e.serviceList.filter((service) => service.id === s.id))
1040 .flat()
1041 let samePrice = services.every((service) => service.price === services[0].price)
1042 if (services.length && samePrice) {
1043 s.price = services[0].price
1044 }
1045 })
1046 },
1047 },
1048
1049 actions: {
1050 getEntities({ commit, rootState }, payload) {
1051 let types = payload.types
1052
1053 if (payload.loadEntities && (payload.isPanel || !getEntitiesVariableName())) {
1054 httpClient
1055 .get('/entities', { params: useUrlParams({ types: types, page: 'booking', lite: true }) })
1056 .then((response) => {
1057 window.ameliaAppointmentEntities = response.data.data
1058
1059 let entities = JSON.parse(JSON.stringify(window.ameliaAppointmentEntities))
1060
1061 setEntities(
1062 { commit, rootState },
1063 entities,
1064 types,
1065 payload.licence,
1066 payload.showHidden,
1067 payload.isPanel,
1068 )
1069 })
1070 } else {
1071 let ameliaApiInterval = setInterval(() => {
1072 let name = getEntitiesVariableName()
1073
1074 if (name) {
1075 clearInterval(ameliaApiInterval)
1076
1077 let entities = JSON.parse(JSON.stringify(window[name]))
1078
1079 setEntities(
1080 { commit, rootState },
1081 entities,
1082 types,
1083 payload.licence,
1084 payload.showHidden,
1085 payload.isPanel,
1086 )
1087 }
1088 }, 1000)
1089 }
1090 },
1091 },
1092 }
1093