PluginProbe ʕ •ᴥ•ʔ
Booking for Appointments and Events Calendar – Amelia / 1.2.31
Booking for Appointments and Events Calendar – Amelia v1.2.31
2.4.9 2.4.8 2.4.7 2.4.6 2.4.5 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 1 year ago attendee.js 1 year ago auth.js 1 year ago bookableType.js 3 years ago booking.js 1 year ago cabinet.js 2 years ago cabinetFilters.js 1 year ago coupon.js 2 years ago customFields.js 1 year ago customerInfo.js 1 year ago employee.js 1 year ago entities.js 1 year ago event.js 1 year ago eventBooking.js 3 years ago eventEntities.js 1 year ago eventWaitingListOptions.js 1 year ago pagination.js 3 years ago params.js 1 year ago payment.js 3 years ago persons.js 1 year ago recurring.js 1 year ago shortcodeParams.js 2 years ago tickets.js 1 year ago
entities.js
794 lines
1 import httpClient from "../../plugins/axios.js";
2 import {
3 settings,
4 shortLocale,
5 longLocale
6 } from "../../plugins/settings.js";
7 import {useUrlParams, useUrlQueryParams} from "../../assets/js/common/helper";
8 import { getBadgeTranslated, useTranslateEntities } from "../../assets/js/public/translation";
9 import { useParsedCustomPricing } from "../../assets/js/common/employee";
10
11 function isEmployeeServiceLocation (relations, employeeId, serviceId, locationId = null) {
12 if (locationId) {
13 return employeeId in relations && serviceId in relations[employeeId] && relations[employeeId][serviceId].indexOf(locationId) !== -1
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) {
107 commit('setShowHidden', showHidden)
108
109 let availableTranslationsShort = settings.general.usedLanguages.map(
110 key => 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 (settings.general.usedLanguages.indexOf(longLocale) !== -1 ||
122 availableTranslationsShort.indexOf(shortLocale) !== -1
123 ) {
124 useTranslateEntities(entities)
125
126 rootState.settings.roles.providerBadges.badges.forEach(badge => {
127 badge.content = getBadgeTranslated(badge)
128 })
129 }
130
131 types.forEach(ent => {
132 if (!(ent in entities)) {
133 entities[ent] = []
134 }
135
136 if (ent === 'categories') {
137 if (settings.activation.stash) {
138 entities[ent].sort((a, b) => a.position - b.position)
139 }
140
141 entities[ent].forEach((category, categoryIndex) => {
142 if (settings.activation.stash) {
143 category.serviceList.sort((a, b) => a.position - b.position)
144 }
145 category.serviceList.forEach((service, serviceIndex) => {
146 entities[ent][categoryIndex].serviceList[serviceIndex].customPricing = useParsedCustomPricing(service)
147 })
148 })
149 }
150
151 if (ent === 'employees') {
152 let arr = []
153 entities[ent].forEach((employee, employeeIndex) => {
154 employee.serviceList.forEach((employeeService, serviceIndex) => {
155 let service = entities.categories.find(
156 c => c.serviceList.filter(s => parseInt(s.id) === parseInt(employeeService.id)).length
157 ).serviceList.find(s => parseInt(s.id) === parseInt(employeeService.id))
158
159 let employeePrice = entities[ent][employeeIndex].serviceList[serviceIndex].price
160 let employeeMinCapacity = entities[ent][employeeIndex].serviceList[serviceIndex].minCapacity
161 let employeeMaxCapacity = entities[ent][employeeIndex].serviceList[serviceIndex].maxCapacity
162
163 entities[ent][employeeIndex].serviceList[serviceIndex] = JSON.parse(JSON.stringify(service))
164
165 entities[ent][employeeIndex].serviceList[serviceIndex].price = employeePrice
166 entities[ent][employeeIndex].serviceList[serviceIndex].minCapacity = employeeMinCapacity
167 entities[ent][employeeIndex].serviceList[serviceIndex].maxCapacity = employeeMaxCapacity
168
169 entities[ent][employeeIndex].serviceList[serviceIndex].customPricing = useParsedCustomPricing(
170 employeeService.customPricing ? employeeService : service
171 )
172 })
173
174 if (employee.badgeId) {
175 employee.badge = rootState.settings.roles.providerBadges.badges.find(badge => badge.id === employee.badgeId)
176 } else {
177 employee.badge = null
178 }
179
180 if (showHidden || employee.status !== 'hidden') {
181 arr.push(employee)
182 }
183 })
184 commit('setUnfilteredEmployees', arr)
185 }
186
187 if (ent === 'locations') {
188 let arr = []
189 entities[ent].forEach((location) => {
190 if (showHidden || location.status !== 'hidden') {
191 arr.push(location)
192 }
193 })
194 commit('setUnfilteredLocations', arr)
195 }
196
197 commit(
198 'set' + ent.charAt(0).toUpperCase() + ent.slice(1),
199 ent === 'customFields' ? entities['customFields'].sort(function(a, b) {
200 if (a['saveType'] === b['saveType']) {
201 return a['position'] - b['position']
202 }
203 return a['saveType'].localeCompare(b['saveType'])
204 }) : entities[ent]
205 )
206 })
207
208 commit('setPreselectedFromUrl')
209 commit('setPreselectedValues')
210 commit('setReady', true)
211 }
212
213 function getEntitiesVariableName () {
214 return 'ameliaAppointmentEntities' in window
215 ? 'ameliaAppointmentEntities'
216 : ('ameliaEntities' in window ? 'ameliaEntities' : false)
217 }
218
219 export default {
220 namespaced: true,
221
222 state: () => ({
223 settings: [],
224 taxes: [],
225 categories: [],
226 services: [],
227 employees: [],
228 unfilteredEmployees: [],
229 locations: [],
230 unfilteredLocations: [],
231 packages: [],
232 entitiesRelations: {},
233 customFields: [],
234 tags: [],
235 spaces: [],
236 ready: false,
237 showHidden: false,
238 originalPreselected: {},
239 preselected: {}
240 }),
241
242 getters: {
243 getSettings (state) {
244 return state.settings
245 },
246
247 getSpaces (state) {
248 return state.spaces
249 },
250
251 getEntitiesRelations (state) {
252 return state.entitiesRelations
253 },
254
255 getOriginalPreselected (state) {
256 return JSON.parse(JSON.stringify(state.originalPreselected))
257 },
258
259 getPreselected (state) {
260 return state.preselected
261 },
262
263 getTaxes (state) {
264 return state.taxes
265 },
266
267 getTax: (state) => (id) => {
268 return state.taxes.find(i => parseInt(i.id) === parseInt(id)) || null
269 },
270
271 getCategories (state) {
272 return state.categories
273 },
274
275 getCategory: (state) => (id) => {
276 return state.categories.find(i => parseInt(i.id) === parseInt(id)) || null
277 },
278
279 getPackages (state) {
280 return state.packages
281 },
282
283 getPackage: (state) => (id) => {
284 return state.packages.find(i => parseInt(i.id) === parseInt(id)) || null
285 },
286
287 getServices (state) {
288 return state.services
289 },
290
291 getService: (state) => (id) => {
292 return state.services.find(i => parseInt(i.id) === parseInt(id)) || null
293 },
294
295 getUnfilteredEmployees (state) {
296 return state.unfilteredEmployees
297 },
298
299 getUnfilteredEmployee: (state) => (id) => {
300 return state.unfilteredEmployees.find(a => parseInt(a.id) === parseInt(id)) || null
301 },
302
303 getEmployees (state) {
304 return state.employees
305 },
306
307 getEmployee: (state) => (id) => {
308 return state.employees.find(i => parseInt(i.id) === parseInt(id)) || null
309 },
310
311 getEmployeeService: (state) => (providerId, serviceId) => {
312 return state.employees.find(
313 i => parseInt(i.id) === parseInt(providerId)
314 ).serviceList.find(
315 i => parseInt(i.id) === parseInt(serviceId)
316 )
317 },
318
319 getUnfilteredLocations (state) {
320 return state.unfilteredLocations
321 },
322
323 getUnfilteredLocation: (state) => (id) => {
324 return state.unfilteredLocations.find(i => parseInt(i.id) === parseInt(id)) || null
325 },
326
327 getLocations (state) {
328 return state.locations
329 },
330
331 getLocation: (state) => (id) => {
332 return state.locations.find(i => parseInt(i.id) === parseInt(id)) || null
333 },
334
335 getTags (state) {
336 return state.tags
337 },
338
339 getCustomFields (state) {
340 return state.customFields
341 },
342
343 getCustomField: (state) => (id) => {
344 return state.customFields.find(i => parseInt(i.id) === parseInt(id)) || null
345 },
346
347 filteredCategories: (state, getters) => (data) => {
348 let categories = []
349
350 let categoriesIds = getters.filteredServices(data).filter(service => !data.serviceId || service.id === data.serviceId).map(service => service.categoryId)
351
352 state.categories.forEach((category) => {
353 if (categoriesIds.indexOf(category.id) !== -1) {
354 let availableCategory = Object.assign(
355 {},
356 category
357 )
358 availableCategory.serviceList = getters.filteredServices(data).filter(service => service.categoryId === category.id)
359 categories.push(availableCategory)
360 }
361 })
362
363 return categories
364 },
365
366 filteredServices: (state, getters) => (data) => {
367 return state.services.filter(service =>
368 (!data.categoryId ? true : service.categoryId === data.categoryId) &&
369 (!data.providerId ? true : isEmployeeServiceLocation(state.entitiesRelations, data.providerId, service.id)) &&
370 (!data.locationId ? true :
371 getters.filteredEmployees(data).filter(
372 employee => isEmployeeServiceLocation(state.entitiesRelations, employee.id, service.id, data.locationId)
373 ).length > 0
374 )
375 )
376 },
377
378 filteredPackagesPreselected: (state, getters) => () => {
379 let preselected = getters.getOriginalPreselected
380 return state.packages.filter(pack =>
381 (preselected.service.length === 0 ? true :
382 pack.bookable.filter(
383 b => preselected.service.map(s => parseInt(s)).includes(b.service.id)
384 ).length > 0)
385 && (preselected.employee.length === 0 ? true :
386 pack.bookable.filter(
387 b => b.providers.length ? b.providers.find(p => preselected.employee.includes(p.id)) :
388 preselected.employee.map(e => parseInt(e)).filter(provider => isEmployeeServiceLocation(state.entitiesRelations, provider, b.service.id)).length > 0
389 ).length === pack.bookable.length)
390 && (preselected.category.length === 0 ? true :
391 pack.bookable.filter(
392 b => preselected.category.map(c => parseInt(c)).includes(b.service.categoryId)
393 ).length === pack.bookable.length)
394 && (preselected.location.length === 0 ? true :
395 pack.bookable.filter(
396 b => (b.locations.length ? b.locations.find(l => preselected.location.map(l => parseInt(l)).includes(l.id)) : (
397 (b.providers.length > 0 ? b.providers : state.employees).filter(
398 employee =>
399 preselected.location.map(l => parseInt(l)).filter(l => isEmployeeServiceLocation(state.entitiesRelations, employee.id, b.service.id, l)).length > 0
400 ).length > 0
401 ))
402 ).length === pack.bookable.length)
403 )
404 },
405
406 filteredPackages: (state, getters) => (data) => {
407 let packagesFiltered = getters.filteredPackagesPreselected()
408
409 return packagesFiltered.filter(pack =>
410 (state.showHidden || pack.status === 'visible')
411 && pack.bookable.length
412 && pack.available
413 && (!data.serviceId ? true :
414 pack.bookable.filter(
415 b => b.service.id === data.serviceId
416 ).length > 0)
417 && (!data.providerId ? true :
418 pack.bookable.filter(
419 b => b.providers.length ? b.providers.find(p => data.providerId === p.id) : isEmployeeServiceLocation(state.entitiesRelations, data.providerId, b.service.id)
420 ).length === pack.bookable.length)
421 && (!data.categoryId ? true :
422 (
423 state.originalPreselected.category.length
424 ? pack.bookable.filter(
425 b => b.service.categoryId === data.categoryId
426 ).length === pack.bookable.length
427 : pack.bookable.filter(
428 b => b.service.categoryId === data.categoryId
429 ).length > 0
430 )
431 )
432 && (!data.locationId ? true :
433 pack.bookable.filter(
434 b => (b.locations.length ? b.locations.find(l => data.locationId === l.id) : (
435 (b.providers.length > 0 ? b.providers : getters.filteredEmployees(data)).filter(
436 employee => isEmployeeServiceLocation(state.entitiesRelations, employee.id, b.service.id, data.locationId)
437 ).length > 0
438 ))
439 ).length === pack.bookable.length)
440 )
441 },
442
443 filteredLocations: (state, getters) => (data) => {
444 return state.locations.filter(location =>
445 (!data.providerId ? true :
446 state.employees.length ? state.employees.find(i => i.id === data.providerId).serviceList.filter(
447 employeeService => {
448 return (state.showHidden || employeeService.status === 'visible') &&
449 isEmployeeServiceLocation(state.entitiesRelations, data.providerId, employeeService.id, location.id)
450 }).length > 0 : false
451 ) &&
452 (!data.serviceId || data.packageId ? true :
453 getters.filteredEmployees(data).find(
454 employee => isEmployeeServiceLocation(state.entitiesRelations, employee.id, data.serviceId, location.id)
455 ) !== undefined
456 ) &&
457 (!data.packageId ? true :
458 state.packages.find(i => i.id === data.packageId).bookable.filter((book) => {
459 return book.locations.length ? book.locations.find(l => l.id === location.id) :
460 (getters.filteredEmployees(data).filter(
461 employee => isEmployeeServiceLocation(state.entitiesRelations, employee.id, book.service.id, location.id)
462 ).length > 0)
463 }).length > 0
464 )
465 )
466 },
467
468 filteredEmployees: (state) => (data) => {
469 return state.employees.filter(employee =>
470 employee.serviceList.find(
471 service =>
472 (state.showHidden || service.status === 'visible') &&
473 // service.maxCapacity >= data.persons &&
474 (!data.serviceId ? true : isEmployeeServiceLocation(state.entitiesRelations, employee.id, service.id) && service.id === data.serviceId) &&
475 (!data.locationId ? true : isEmployeeServiceLocation(state.entitiesRelations, employee.id, service.id, data.locationId))
476 ) !== undefined
477 )
478 },
479
480 getEmployeeServices: (state, getters) => (data) => {
481 let employeeServices = []
482
483 if (data.serviceId) {
484 let service = getters.getService(data.serviceId)
485 if (data.providerId) {
486 let possibleEmployee = state.employees.find(i => i.id === data.providerId)
487 if (!possibleEmployee) return {}
488 let employeeService = possibleEmployee.serviceList.filter(service => service.id === data.serviceId)
489 return employeeService.map(eS => Object.assign(eS, {bringingAnyone: service.bringingAnyone, aggregatedPrice: service.aggregatedPrice, maxExtraPeople: service.maxExtraPeople}))
490 }
491
492 getters.filteredEmployees(data).forEach((employee) => {
493 employee.serviceList.forEach((employeeService) => {
494 if (employeeService.id === data.serviceId) {
495 employeeServices.push(Object.assign(employeeService, {bringingAnyone: service.bringingAnyone, aggregatedPrice: service.aggregatedPrice, maxExtraPeople: service.maxExtraPeople}))
496 }
497 })
498 })
499 }
500
501 return employeeServices
502 },
503
504 getBookableFromBookableEntities: (state) => (data) => {
505 switch (data.type) {
506 case ('appointment'):
507 return state.services.find(i => i.id === data.serviceId)
508 case ('package'):
509 return state.packages.find(i => i.id === data.packageId)
510 }
511 },
512
513 getReady (state) {
514 return state.ready
515 },
516
517 getShowHidden (state) {
518 return state.showHidden
519 },
520
521 getPackageEntities: (state, getters) => (packageId) => {
522 let entities = {services: [], providers: [], locations: [], packages: []}
523 let pack = getters.getPackage(packageId)
524 if (pack) {
525 pack.bookable.forEach(bookable => {
526 entities.services.push(bookable.service.id)
527 let employees = []
528 if (bookable.providers.length > 0) {
529 employees = bookable.providers.map(p => p.id)
530 } else {
531 employees = state.employees.filter(e => e.serviceList.find(s => s.id === bookable.service.id)).map(e => e.id)
532 }
533 entities.providers = entities.providers.concat(employees)
534 let locations = []
535 if (bookable.locations.length > 0) {
536 locations = bookable.locations.map(p => p.id)
537 } else {
538 state.locations.forEach(location =>
539 employees.forEach(e => {
540 if (isEmployeeServiceLocation(state.entitiesRelations, e, bookable.service.id, location.id)) {
541 locations.push(location.id)
542 }
543 })
544 )
545 }
546 entities.locations = entities.locations.concat(locations)
547 })
548
549 entities.packages.push(pack.id)
550 }
551 return entities
552 }
553 },
554
555 mutations: {
556 setSettings (state, payload) {
557 state.settings = payload
558 },
559
560 setSpaces (state, payload) {
561 state.spaces = payload
562 },
563
564 setTaxes (state, payload) {
565 state.taxes = payload
566 },
567
568 setCategories (state, payload) {
569 state.categories = payload
570
571 let services = []
572
573 state.categories.forEach((category) => {
574 category.serviceList.forEach((service) => {
575 services.push(service)
576 })
577 })
578
579 state.services = services
580 },
581
582 setUnfilteredEmployees (state, payload) {
583 state.unfilteredEmployees = payload
584 },
585
586 setUnfilteredLocations (state, payload) {
587 state.unfilteredLocations = payload
588 },
589
590 setEmployees (state, payload) {
591 state.employees = payload
592 },
593
594 setLocations (state, payload) {
595 state.locations = payload
596 },
597
598 setTags (state, payload) {
599 state.tags = payload
600 },
601
602 setPackages (state, payload) {
603 payload.forEach(pack => {
604 let isAvailable = true
605
606 pack.bookable.forEach(book => {
607 if (!book.service.name) {
608 let service = state.services.find(s => s.id === book.service.id)
609 if (service) {
610 book.service = service
611 }
612 }
613
614 if (state.showHidden ? false : book.service.status !== 'visible') {
615 isAvailable = false
616 }
617 })
618
619 if (isAvailable) {
620 state.packages.push(pack)
621 }
622 })
623
624 state.packages.sort((a, b) => a.position - b.position)
625 },
626
627 setCustomFields (state, payload) {
628 state.customFields = [...Object.values(payload)]
629 },
630
631 setEntitiesRelations (state, payload) {
632 state.entitiesRelations = payload
633 },
634
635 setReady (state, payload) {
636 state.ready = payload
637 },
638
639 setShowHidden (state, payload) {
640 state.showHidden = payload
641 },
642
643 setPreselected (state, payload) {
644 state.preselected = payload
645 state.preselected = Object.assign({}, state.preselected,
646 {category: Array.isArray(state.preselected.category) ? state.preselected.category : (state.preselected.category ? state.preselected.category.toString().split(',').map(c=>parseInt(c)) : []),
647 service: Array.isArray(state.preselected.service) ? state.preselected.service : (state.preselected.service ? state.preselected.service.toString().split(',').map(c=>parseInt(c)) : []),
648 employee: Array.isArray(state.preselected.employee) ? state.preselected.employee : (state.preselected.employee ? state.preselected.employee.toString().split(',').map(c=>parseInt(c)) : []),
649 location: Array.isArray(state.preselected.location) ? state.preselected.location : (state.preselected.location ? state.preselected.location.toString().split(',').map(c=>parseInt(c)) : []),
650 package: Array.isArray(state.preselected.package) ? state.preselected.package : (state.preselected.package ? state.preselected.package.toString().split(',').map(c=>parseInt(c)) : [])
651 })
652 },
653
654 setPreselectedFromUrl (state) {
655 let urlParameters = useUrlQueryParams(window.location.href)
656 if (urlParameters) {
657 if (urlParameters.ameliaServiceId) {
658 state.preselected.service = urlParameters.ameliaServiceId.split(',').map(a => parseInt(a))
659 }
660 if (urlParameters.ameliaEmployeeId) {
661 state.preselected.employee = urlParameters.ameliaEmployeeId.split(',').map(a => parseInt(a))
662 }
663 if (urlParameters.ameliaLocationId) {
664 state.preselected.location = urlParameters.ameliaLocationId.split(',').map(a => parseInt(a))
665 }
666 if (urlParameters.ameliaCategoryId) {
667 state.preselected.category = urlParameters.ameliaCategoryId.split(',').map(a => parseInt(a))
668 }
669 }
670 },
671
672 setPreselectedValues (state) {
673 state.originalPreselected = JSON.parse(JSON.stringify(state.preselected))
674
675 state.employees = state.employees.filter(e => state.showHidden || e.status === 'visible')
676 state.services = state.services.filter(s => (state.showHidden ? true : s.status === 'visible' && s.show) && state.employees.filter(e => e.serviceList.find(eS => eS.id === s.id)).length)
677 state.locations = state.locations.filter(l => state.showHidden || l.status === 'visible')
678
679 if ('category' in state.preselected && state.preselected.category.length > 0) {
680 state.categories = state.categories.filter(c => state.preselected.category.map(id => parseInt(id)).includes(c.id))
681 state.services = state.services.filter(s => state.preselected.category.map(id => parseInt(id)).includes(s.categoryId))
682 state.employees = state.employees.filter(e => e.serviceList.filter(s => state.preselected.category.map(id => parseInt(id)).includes(s.categoryId)).length > 0)
683 state.locations = state.locations.filter(l =>
684 state.employees.filter(e =>
685 state.services.filter(s => isEmployeeServiceLocation(state.entitiesRelations, e.id, s.id, l.id) && state.preselected.category.map(id => parseInt(id)).includes(s.categoryId)).length > 0
686 ).length > 0
687 )
688 }
689
690 if ('service' in state.preselected && state.preselected.service.length > 0) {
691 state.services = state.services.filter(s => state.preselected.service.map(id => parseInt(id)).includes(s.id))
692 state.categories = state.categories.filter(c => state.services.map(serv => serv.categoryId).includes(c.id))
693 state.employees = state.employees.filter(e => e.serviceList.filter(s => state.preselected.service.map(id => parseInt(id)).includes(s.id)).length > 0)
694 state.locations = state.locations.filter(l =>
695 state.employees.filter(e => state.preselected.service
696 .filter(serviceId =>
697 isEmployeeServiceLocation(state.entitiesRelations, e.id, parseInt(serviceId), l.id)
698 ).length > 0
699 ).length > 0
700 )
701 }
702
703 if ('employee' in state.preselected && state.preselected.employee.length > 0) {
704 state.employees = state.employees.filter(e => state.preselected.employee.map(id => parseInt(id)).includes(e.id))
705 if (state.employees.length > 0) {
706 state.services = state.services.filter(s => state.employees.filter(e => e.serviceList.filter(serv => serv.id === s.id).length > 0).length > 0)
707
708 state.categories = state.categories.filter(c => state.services.filter(s => s.categoryId === c.id).length > 0)
709 state.locations = state.locations.filter(l =>
710 state.services.filter(s => state.preselected.employee
711 .filter(employeeId =>
712 isEmployeeServiceLocation(state.entitiesRelations, parseInt(employeeId), s.id, l.id)
713 ).length > 0
714 ).length > 0
715 )
716 }
717 }
718
719 if ('location' in state.preselected && state.preselected.location.length > 0) {
720 state.locations = state.locations.filter(e => state.preselected.location.map(id => parseInt(id)).includes(e.id))
721 state.employees = state.employees.filter(e => e.serviceList.filter(
722 s => state.preselected.location
723 .filter(locationId =>
724 isEmployeeServiceLocation(state.entitiesRelations, e.id, s.id, parseInt(locationId))
725 ).length > 0
726 ).length > 0)
727 state.services = state.services.filter(s => state.employees.filter(e => e.serviceList.filter(serv => serv.id === s.id).length > 0).length > 0)
728 state.categories = state.categories.filter(c => state.services.filter(s => s.categoryId === c.id).length > 0)
729 }
730
731 if ('package' in state.preselected && state.preselected.package.length > 0) {
732 state.packages = state.packages.filter(p => state.preselected.package.map(id => parseInt(id)).includes(p.id))
733 state.preselected.show = 'packages'
734 state.services = state.services.filter(s => state.packages.filter(p => p.bookable.filter(b => b.service.id === s.id).length > 0).length > 0)
735 state.categories = state.categories.filter(c => state.services.filter(s => s.categoryId === c.id).length > 0)
736 }
737
738 if (state.services.length === 1 && state.preselected.show !== 'packages') {
739 state.preselected = Object.assign({}, state.preselected, {service: [(state.services[0].id).toString()]})
740 }
741 if (state.categories.length === 1 && state.preselected.show !== 'packages') {
742 state.preselected = Object.assign({}, state.preselected, {category: [(state.categories[0].id).toString()]})
743 }
744 if (state.employees.length === 1 && state.preselected.show !== 'packages') {
745 state.preselected = Object.assign({}, state.preselected, {employee: [(state.employees[0].id).toString()]})
746 }
747 if (state.locations.length === 1 && state.preselected.show !== 'packages') {
748 state.preselected = Object.assign({}, state.preselected, {location: [(state.locations[0].id).toString()]})
749 }
750
751
752 // if all employees have the same price
753 state.services.forEach(s => {
754 let services = state.employees.map(e => e.serviceList.filter(service => service.id === s.id)).flat()
755 let samePrice = services.every(service => service.price === services[0].price)
756 if (services.length && samePrice) {
757 s.price = services[0].price
758 }
759 })
760 },
761 },
762
763 actions: {
764 getEntities ({ commit, rootState }, payload) {
765 let types = payload.types
766
767 if (payload.loadEntities && (payload.isPanel || !getEntitiesVariableName())) {
768 httpClient.get('/entities', { params: useUrlParams({types: types, page: 'booking', lite: true}) }).then(response => {
769 window.ameliaAppointmentEntities = response.data.data
770
771 let entities = JSON.parse(JSON.stringify(window.ameliaAppointmentEntities))
772
773 setEntities({ commit, rootState }, entities, types, payload.licence, payload.showHidden)
774 })
775 } else {
776 let ameliaApiInterval = setInterval(
777 () => {
778 let name = getEntitiesVariableName()
779
780 if (name) {
781 clearInterval(ameliaApiInterval)
782
783 let entities = JSON.parse(JSON.stringify(window[name]))
784
785 setEntities({ commit, rootState }, entities, types, payload.licence, payload.showHidden)
786 }
787 },
788 1000
789 )
790 }
791 }
792 },
793 }
794