PluginProbe ʕ •ᴥ•ʔ
Booking for Appointments and Events Calendar – Amelia / 1.2.32
Booking for Appointments and Events Calendar – Amelia v1.2.32
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 / src / Application / Services / Stash / StashApplicationService.php
ameliabooking / src / Application / Services / Stash Last commit date
StashApplicationService.php 1 year ago
StashApplicationService.php
485 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 ];
378
379 /** @var Service $service */
380 foreach ($tax->getServiceList()->getItems() as $service) {
381 $taxData['serviceList'][] = [
382 'id' => $service->getId()->getValue(),
383 ];
384 }
385
386 /** @var Extra $extra */
387 foreach ($tax->getExtraList()->getItems() as $extra) {
388 $taxData['extraList'][] = [
389 'id' => $extra->getId()->getValue(),
390 ];
391 }
392
393 /** @var Package $package */
394 foreach ($tax->getPackageList()->getItems() as $package) {
395 $taxData['packageList'][] = [
396 'id' => $package->getId()->getValue(),
397 ];
398 }
399
400 /** @var Event $event */
401 foreach ($tax->getEventList()->getItems() as $event) {
402 $taxData['eventList'][] = [
403 'id' => $event->getId()->getValue(),
404 ];
405 }
406
407 $resultData['taxes'][] = $taxData;
408 }
409
410 $settingsDomainService->setStashEntities($resultData);
411 }
412
413 /**
414 * @return array
415 * @throws InvalidArgumentException
416 */
417 public function getStash()
418 {
419 /** @var ProviderApplicationService $providerAS */
420 $providerAS = $this->container->get('application.user.provider.service');
421
422 /** @var SettingsService $settingsDomainService */
423 $settingsDomainService = $this->container->get('domain.settings.service');
424
425 $entitiesData = $settingsDomainService->getStashEntities();
426
427 if ($entitiesData) {
428 /** @var Collection $locations */
429 $locations = new Collection();
430
431 foreach ($entitiesData['locations'] as $locationData) {
432 $locations->addItem(LocationFactory::create($locationData), $locationData['id']);
433 }
434
435
436 /** @var Collection $services */
437 $services = new Collection();
438
439 foreach ($entitiesData['categories'] as $categoryData) {
440 foreach ($categoryData['serviceList'] as $serviceData) {
441 $services->addItem(ServiceFactory::create($serviceData), $serviceData['id']);
442 }
443 }
444
445
446 /** @var Collection $providers */
447 $providers = new Collection();
448
449 foreach ($entitiesData['employees'] as &$employeeData) {
450 $employeeData['type'] = AbstractUser::USER_ROLE_PROVIDER;
451
452 $providers->addItem(ProviderFactory::create($employeeData), $employeeData['id']);
453
454 unset(
455 $employeeData['email'],
456 $employeeData['weekDayList'],
457 $employeeData['specialDayList'],
458 $employeeData['dayOffList']
459 );
460 }
461
462 $entitiesRelations = [];
463
464 /** @var Provider $provider */
465 foreach ($providers->getItems() as $providerId => $provider) {
466 if ($data = $providerAS->getProviderServiceLocations($provider, $locations, $services)) {
467 $entitiesRelations[$providerId] = $data;
468 }
469 }
470
471 $currentDateTime = DateTimeService::getNowDateTimeObject();
472
473 foreach ($entitiesData['packages'] as &$packageData) {
474 $packageData['available'] =
475 !$packageData['endDate'] ||
476 DateTimeService::getCustomDateTimeObject($packageData['endDate']) > $currentDateTime;
477 }
478
479 $entitiesData['entitiesRelations'] = $entitiesRelations;
480 }
481
482 return $entitiesData;
483 }
484 }
485