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 |