PluginProbe ʕ •ᴥ•ʔ
Booking for Appointments and Events Calendar – Amelia / 2.0.2
Booking for Appointments and Events Calendar – Amelia v2.0.2
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 / src / Application / Services / Stash / StashApplicationService.php
ameliabooking / src / Application / Services / Stash Last commit date
StashApplicationService.php 6 months ago
StashApplicationService.php
489 lines
1 <?php
2
3 namespace AmeliaBooking\Application\Services\Stash;
4
5 use AmeliaBooking\Application\Services\Booking\EventApplicationService;
6 use AmeliaBooking\Application\Services\Location\AbstractLocationApplicationService;
7 use AmeliaBooking\Application\Services\Tax\TaxApplicationService;
8 use AmeliaBooking\Application\Services\User\ProviderApplicationService;
9 use AmeliaBooking\Domain\Collection\Collection;
10 use AmeliaBooking\Domain\Common\Exceptions\InvalidArgumentException;
11 use AmeliaBooking\Domain\Entity\Bookable\Service\Category;
12 use AmeliaBooking\Domain\Entity\Bookable\Service\Extra;
13 use AmeliaBooking\Domain\Entity\Bookable\Service\Package;
14 use AmeliaBooking\Domain\Entity\Bookable\Service\PackageService;
15 use AmeliaBooking\Domain\Entity\Bookable\Service\Service;
16 use AmeliaBooking\Domain\Entity\Booking\Event\Event;
17 use AmeliaBooking\Domain\Entity\CustomField\CustomField;
18 use AmeliaBooking\Domain\Entity\Location\Location;
19 use AmeliaBooking\Domain\Entity\Tax\Tax;
20 use AmeliaBooking\Domain\Entity\User\AbstractUser;
21 use AmeliaBooking\Domain\Entity\User\Provider;
22 use AmeliaBooking\Domain\Factory\Bookable\Service\ServiceFactory;
23 use AmeliaBooking\Domain\Factory\Location\LocationFactory;
24 use AmeliaBooking\Domain\Factory\User\ProviderFactory;
25 use AmeliaBooking\Domain\Services\DateTime\DateTimeService;
26 use AmeliaBooking\Domain\Services\Settings\SettingsService;
27 use AmeliaBooking\Domain\Services\User\ProviderService;
28 use AmeliaBooking\Infrastructure\Common\Container;
29 use AmeliaBooking\Infrastructure\Common\Exceptions\QueryExecutionException;
30 use AmeliaBooking\Infrastructure\Repository\Bookable\Service\CategoryRepository;
31 use AmeliaBooking\Infrastructure\Repository\Bookable\Service\PackageRepository;
32 use AmeliaBooking\Infrastructure\Repository\Bookable\Service\ServiceRepository;
33 use AmeliaBooking\Infrastructure\Repository\Booking\Event\EventTagsRepository;
34 use AmeliaBooking\Infrastructure\Repository\CustomField\CustomFieldRepository;
35 use AmeliaBooking\Infrastructure\Repository\User\ProviderRepository;
36 use Interop\Container\Exception\ContainerException;
37
38 /**
39 * Class StashApplicationService
40 *
41 * @package AmeliaBooking\Application\Stash
42 */
43 class StashApplicationService
44 {
45 private $container;
46
47 /**
48 * StashApplicationService constructor.
49 *
50 * @param Container $container
51 *
52 */
53 public function __construct(Container $container)
54 {
55 $this->container = $container;
56 }
57
58 /**
59 * @param array $daysOffNew
60 *
61 * @return void
62 * @throws QueryExecutionException
63 * @throws InvalidArgumentException
64 * @throws ContainerException
65 */
66 public function setStash($daysOffNew = null)
67 {
68 /** @var SettingsService $settingsDomainService */
69 $settingsDomainService = $this->container->get('domain.settings.service');
70
71 /** @var ProviderApplicationService $providerAS */
72 $providerAS = $this->container->get('application.user.provider.service');
73
74 /** @var EventApplicationService $eventAS */
75 $eventAS = $this->container->get('application.booking.event.service');
76
77 /** @var ProviderService $providerService */
78 $providerService = $this->container->get('domain.user.provider.service');
79
80 /** @var AbstractLocationApplicationService $locationAS */
81 $locationAS = $this->container->get('application.location.service');
82
83 /** @var ServiceRepository $serviceRepository */
84 $serviceRepository = $this->container->get('domain.bookable.service.repository');
85
86 /** @var CategoryRepository $categoryRepository */
87 $categoryRepository = $this->container->get('domain.bookable.category.repository');
88
89 /** @var ProviderRepository $providerRepository */
90 $providerRepository = $this->container->get('domain.users.providers.repository');
91
92 /** @var CustomFieldRepository $customFieldRepository */
93 $customFieldRepository = $this->container->get('domain.customField.repository');
94
95 /** @var EventTagsRepository $eventTagsRepository */
96 $eventTagsRepository = $this->container->get('domain.booking.event.tag.repository');
97
98 /** @var Collection $events */
99 $events = $eventAS->getEventsByCriteria(
100 [
101 'dates' => [DateTimeService::getNowDateTime()],
102 'show' => 1
103 ],
104 [
105 ],
106 0
107 );
108
109 /** @var TaxApplicationService $taxApplicationService */
110 $taxApplicationService = $this->container->get('application.tax.service');
111
112 /** @var Collection $taxes */
113 $taxes = $taxApplicationService->getAll();
114
115 /** @var Collection $services */
116 $services = $serviceRepository->getAllArrayIndexedById();
117
118 /** @var Collection $locations */
119 $locations = $locationAS->getAllOrderedByName();
120
121 /** @var Collection $providers */
122 $providers = $providerRepository->getWithSchedule(
123 ['dates' => [DateTimeService::getNowDateTimeObject()->modify('-1 days')->format('Y-m-d H:i:s')]]
124 );
125
126
127 /** @var Collection $availableLocations */
128 $availableLocations = new Collection();
129
130 /** @var Collection $availableServices */
131 $availableServices = new Collection();
132
133 /** @var Collection $availableProviders */
134 $availableProviders = new Collection();
135
136 $entitiesRelations = [];
137
138 /** @var Provider $provider */
139 foreach ($providers->getItems() as $providerId => $provider) {
140 if ($provider->getLocationId() && !$availableLocations->keyExists($provider->getLocationId()->getValue())) {
141 $availableLocations->addItem(
142 $locations->getItem($provider->getLocationId()->getValue()),
143 $provider->getLocationId()->getValue()
144 );
145 }
146
147 $providerService->setProviderServices($provider, $services, true);
148
149 if ($data = $providerAS->getProviderServiceLocations($provider, $locations, $services, true)) {
150 $entitiesRelations[$providerId] = $data;
151 }
152 }
153
154 foreach ($entitiesRelations as $providerId => $providerServiceRelations) {
155 foreach ($providerServiceRelations as $serviceId => $serviceLocationRelations) {
156 foreach ($serviceLocationRelations as $locationId) {
157 if ($locationId && !$availableLocations->keyExists($locationId)) {
158 $availableLocations->addItem($locations->getItem($locationId), $locationId);
159 }
160 }
161
162 if (!$availableServices->keyExists($serviceId)) {
163 $availableServices->addItem($services->getItem($serviceId), $serviceId);
164 }
165 }
166
167 $availableProviders->addItem($providers->getItem($providerId), $providerId);
168 }
169
170 /** @var \AmeliaBooking\Application\Services\Settings\SettingsService $settingsAS*/
171 $settingsAS = $this->container->get('application.settings.service');
172 $daysOff = $settingsAS->getDaysOff($daysOffNew);
173
174 $resultData = [
175 'categories' => [],
176 'employees' => [],
177 'locations' => [],
178 'customFields' => [],
179 'tags' => [],
180 'packages' => [],
181 'settings' => [
182 'daysOff' => $daysOff
183 ],
184 ];
185
186 /** @var Event $event */
187 foreach ($events->getItems() as $event) {
188 if ($event->getLocationId() && !$availableLocations->keyExists($event->getLocationId()->getValue())) {
189 $availableLocations->addItem(
190 $locations->getItem($event->getLocationId()->getValue()),
191 $event->getLocationId()->getValue()
192 );
193 }
194 }
195
196 /** @var Collection $eventsTags */
197 $eventsTags = $eventTagsRepository->getAllDistinctByCriteria([]);
198
199 $resultData['tags'] = $eventsTags->toArray();
200
201 if ($locations->length() && !$availableLocations->length()) {
202 $settingsDomainService->setStashEntities($resultData);
203
204 return;
205 }
206
207
208 /** @var Location $location */
209 foreach ($availableLocations->getItems() as $location) {
210 $resultData['locations'][] = [
211 'id' => $location->getId()->getValue(),
212 'name' => $location->getName()->getValue(),
213 'status' => $location->getStatus()->getValue(),
214 'address' => $location->getAddress()->getValue(),
215 'description' => $location->getDescription() ? $location->getDescription()->getValue() : null,
216 'translations' => $location->getTranslations() ? $location->getTranslations()->getValue() : null
217 ];
218 }
219
220
221 /** @var Collection $categories */
222 $categories = $categoryRepository->getAllIndexedById();
223
224 $availableCategories = new Collection();
225
226 /** @var Service $service */
227 foreach ($availableServices->getItems() as $service) {
228 if (!$availableCategories->keyExists($service->getCategoryId()->getValue())) {
229 /** @var Category $category */
230 $category = $categories->getItem($service->getCategoryId()->getValue());
231
232 $category->setServiceList(new Collection());
233
234 $availableCategories->addItem(
235 $category,
236 $service->getCategoryId()->getValue()
237 );
238 }
239
240 /** @var Category $category */
241 $category = $availableCategories->getItem($service->getCategoryId()->getValue());
242
243 $category->getServiceList()->addItem($service, $service->getId()->getValue());
244 }
245
246 $resultData['categories'] = $availableCategories->toArray();
247
248
249 /** @var Provider $provider */
250 foreach ($availableProviders->getItems() as $provider) {
251 $providerData = [
252 'id' => $provider->getId()->getValue(),
253 'firstName' => $provider->getFirstName()->getValue(),
254 'lastName' => $provider->getLastName()->getValue(),
255 'email' => $provider->getEmail()->getValue(),
256 'status' => $provider->getStatus()->getValue(),
257 'show' => $provider->getShow()->getValue(),
258 'pictureFullPath' => $provider->getPicture() ? $provider->getPicture()->getFullPath() : null,
259 'pictureThumbPath' => $provider->getPicture() ? $provider->getPicture()->getThumbPath() : null,
260 'locationId' => $provider->getLocationId() ? $provider->getLocationId()->getValue() : null,
261 'serviceList' => [],
262 'weekDayList' => $provider->getWeekDayList()->toArray(),
263 'dayOffList' => $provider->getDayOffList()->toArray(),
264 'specialDayList' => $provider->getSpecialDayList()->toArray(),
265 'translations' => $provider->getTranslations() ? $provider->getTranslations()->getValue() : null,
266 'description' => $provider->getDescription() ? $provider->getDescription()->getValue() : null,
267 'badgeId' => $provider->getBadgeId() ? $provider->getBadgeId()->getValue() : null,
268 ];
269
270 /** @var Service $service */
271 foreach ($provider->getServiceList()->getItems() as $service) {
272 if ($availableServices->keyExists($service->getId()->getValue())) {
273 $providerData['serviceList'][] = [
274 'id' => $service->getId()->getValue(),
275 'price' => $service->getPrice()->getValue(),
276 'duration' => $service->getDuration()->getValue(),
277 'customPricing' => $service->getCustomPricing()
278 ? $service->getCustomPricing()->getValue() : null,
279 'minCapacity' => $service->getMinCapacity()->getValue(),
280 'maxCapacity' => $service->getMaxCapacity()->getValue(),
281 'status' => $service->getStatus()->getValue(),
282 'categoryId' => $service->getCategoryId()->getValue()
283 ];
284 }
285 }
286
287 $resultData['employees'][] = $providerData;
288 }
289
290
291 /** @var Collection $customFields */
292 $customFields = $customFieldRepository->getAll();
293
294 /** @var CustomField $customField */
295 foreach ($customFields->getItems() as $customField) {
296 $customFieldData = array_merge(
297 $customField->toArray(),
298 [
299 'services' => [],
300 'events' => []
301 ]
302 );
303
304 /** @var Service $service */
305 foreach ($customField->getServices()->getItems() as $service) {
306 $customFieldData['services'][] = [
307 'id' => $service->getId()->getValue()
308 ];
309 }
310
311 /** @var Event $event */
312 foreach ($customField->getEvents()->getItems() as $event) {
313 $customFieldData['events'][] = [
314 'id' => $event->getId()->getValue()
315 ];
316 }
317
318 $resultData['customFields'][] = $customFieldData;
319 }
320
321
322 /** @var PackageRepository $packageRepository */
323 $packageRepository = $this->container->get('domain.bookable.package.repository');
324
325 /** @var Collection $packages */
326 $packages = $packageRepository->getByCriteria([]);
327
328 /** @var Package $package */
329 foreach ($packages->getItems() as $package) {
330 $packageData = array_merge(
331 $package->toArray(),
332 ['bookable' => []]
333 );
334
335 /** @var PackageService $bookable */
336 foreach ($package->getBookable()->getItems() as $bookable) {
337 $bookableData = array_merge(
338 $bookable->toArray(),
339 [
340 'service' => ['id' => $bookable->getService()->getId()->getValue()],
341 'providers' => [],
342 'locations' => [],
343 ]
344 );
345
346 /** @var Provider $provider */
347 foreach ($bookable->getProviders()->getItems() as $provider) {
348 $bookableData['providers'][] = [
349 'id' => $provider->getId()->getValue()
350 ];
351 }
352
353 /** @var Location $location */
354 foreach ($bookable->getLocations()->getItems() as $location) {
355 $bookableData['locations'][] = [
356 'id' => $location->getId()->getValue()
357 ];
358 }
359
360 $packageData['bookable'][] = $bookableData;
361 }
362
363 $resultData['packages'][] = $packageData;
364 }
365
366 /** @var Tax $tax */
367 foreach ($taxes->getItems() as $tax) {
368 $taxData = [
369 'id' => $tax->getId()->getValue(),
370 'name' => $tax->getName()->getValue(),
371 'type' => $tax->getType()->getValue(),
372 'amount' => $tax->getAmount()->getValue(),
373 'serviceList' => [],
374 'extraList' => [],
375 'packageList' => [],
376 'eventList' => [],
377 'allServices' => $tax->getAllServices() ? $tax->getAllServices()->getValue() : null,
378 'allExtras' => $tax->getAllExtras() ? $tax->getAllExtras()->getValue() : null,
379 'allPackages' => $tax->getAllPackages() ? $tax->getAllPackages()->getValue() : null,
380 'allEvents' => $tax->getAllEvents() ? $tax->getAllEvents()->getValue() : null,
381 ];
382
383 /** @var Service $service */
384 foreach ($tax->getServiceList()->getItems() as $service) {
385 $taxData['serviceList'][] = [
386 'id' => $service->getId()->getValue(),
387 ];
388 }
389
390 /** @var Extra $extra */
391 foreach ($tax->getExtraList()->getItems() as $extra) {
392 $taxData['extraList'][] = [
393 'id' => $extra->getId()->getValue(),
394 ];
395 }
396
397 /** @var Package $package */
398 foreach ($tax->getPackageList()->getItems() as $package) {
399 $taxData['packageList'][] = [
400 'id' => $package->getId()->getValue(),
401 ];
402 }
403
404 /** @var Event $event */
405 foreach ($tax->getEventList()->getItems() as $event) {
406 $taxData['eventList'][] = [
407 'id' => $event->getId()->getValue(),
408 ];
409 }
410
411 $resultData['taxes'][] = $taxData;
412 }
413
414 $settingsDomainService->setStashEntities($resultData);
415 }
416
417 /**
418 * @return array
419 * @throws InvalidArgumentException
420 */
421 public function getStash()
422 {
423 /** @var ProviderApplicationService $providerAS */
424 $providerAS = $this->container->get('application.user.provider.service');
425
426 /** @var SettingsService $settingsDomainService */
427 $settingsDomainService = $this->container->get('domain.settings.service');
428
429 $entitiesData = $settingsDomainService->getStashEntities();
430
431 if ($entitiesData) {
432 /** @var Collection $locations */
433 $locations = new Collection();
434
435 foreach ($entitiesData['locations'] as $locationData) {
436 $locations->addItem(LocationFactory::create($locationData), $locationData['id']);
437 }
438
439
440 /** @var Collection $services */
441 $services = new Collection();
442
443 foreach ($entitiesData['categories'] as $categoryData) {
444 foreach ($categoryData['serviceList'] as $serviceData) {
445 $services->addItem(ServiceFactory::create($serviceData), $serviceData['id']);
446 }
447 }
448
449
450 /** @var Collection $providers */
451 $providers = new Collection();
452
453 foreach ($entitiesData['employees'] as &$employeeData) {
454 $employeeData['type'] = AbstractUser::USER_ROLE_PROVIDER;
455
456 $providers->addItem(ProviderFactory::create($employeeData), $employeeData['id']);
457
458 unset(
459 $employeeData['email'],
460 $employeeData['weekDayList'],
461 $employeeData['specialDayList'],
462 $employeeData['dayOffList']
463 );
464 }
465
466 $entitiesRelations = [];
467
468 /** @var Provider $provider */
469 foreach ($providers->getItems() as $providerId => $provider) {
470 if ($data = $providerAS->getProviderServiceLocations($provider, $locations, $services)) {
471 $entitiesRelations[$providerId] = $data;
472 }
473 }
474
475 $currentDateTime = DateTimeService::getNowDateTimeObject();
476
477 foreach ($entitiesData['packages'] as &$packageData) {
478 $packageData['available'] =
479 !$packageData['endDate'] ||
480 DateTimeService::getCustomDateTimeObject($packageData['endDate']) > $currentDateTime;
481 }
482
483 $entitiesData['entitiesRelations'] = $entitiesRelations;
484 }
485
486 return $entitiesData;
487 }
488 }
489