PluginProbe ʕ •ᴥ•ʔ
Booking for Appointments and Events Calendar – Amelia / 1.2.20
Booking for Appointments and Events Calendar – Amelia v1.2.20
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
483 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 'translations' => $location->getTranslations() ? $location->getTranslations()->getValue() : null
216 ];
217 }
218
219
220 /** @var Collection $categories */
221 $categories = $categoryRepository->getAllIndexedById();
222
223 $availableCategories = new Collection();
224
225 /** @var Service $service */
226 foreach ($availableServices->getItems() as $service) {
227 if (!$availableCategories->keyExists($service->getCategoryId()->getValue())) {
228 /** @var Category $category */
229 $category = $categories->getItem($service->getCategoryId()->getValue());
230
231 $category->setServiceList(new Collection());
232
233 $availableCategories->addItem(
234 $category,
235 $service->getCategoryId()->getValue()
236 );
237 }
238
239 /** @var Category $category */
240 $category = $availableCategories->getItem($service->getCategoryId()->getValue());
241
242 $category->getServiceList()->addItem($service, $service->getId()->getValue());
243 }
244
245 $resultData['categories'] = $availableCategories->toArray();
246
247
248 /** @var Provider $provider */
249 foreach ($availableProviders->getItems() as $provider) {
250 $providerData = [
251 'id' => $provider->getId()->getValue(),
252 'firstName' => $provider->getFirstName()->getValue(),
253 'lastName' => $provider->getLastName()->getValue(),
254 'email' => $provider->getEmail()->getValue(),
255 'status' => $provider->getStatus()->getValue(),
256 'pictureFullPath' => $provider->getPicture() ? $provider->getPicture()->getFullPath() : null,
257 'pictureThumbPath' => $provider->getPicture() ? $provider->getPicture()->getThumbPath() : null,
258 'locationId' => $provider->getLocationId() ? $provider->getLocationId()->getValue() : null,
259 'serviceList' => [],
260 'weekDayList' => $provider->getWeekDayList()->toArray(),
261 'dayOffList' => $provider->getDayOffList()->toArray(),
262 'specialDayList' => $provider->getSpecialDayList()->toArray(),
263 'translations' => $provider->getTranslations() ? $provider->getTranslations()->getValue() : null,
264 'description' => $provider->getDescription() ? $provider->getDescription()->getValue() : null,
265 'badgeId' => $provider->getBadgeId() ? $provider->getBadgeId()->getValue() : null,
266 ];
267
268 /** @var Service $service */
269 foreach ($provider->getServiceList()->getItems() as $service) {
270 if ($availableServices->keyExists($service->getId()->getValue())) {
271 $providerData['serviceList'][] = [
272 'id' => $service->getId()->getValue(),
273 'price' => $service->getPrice()->getValue(),
274 'duration' => $service->getDuration()->getValue(),
275 'customPricing' => $service->getCustomPricing()
276 ? $service->getCustomPricing()->getValue() : null,
277 'minCapacity' => $service->getMinCapacity()->getValue(),
278 'maxCapacity' => $service->getMaxCapacity()->getValue(),
279 'status' => $service->getStatus()->getValue(),
280 'categoryId' => $service->getCategoryId()->getValue()
281 ];
282 }
283 }
284
285 $resultData['employees'][] = $providerData;
286 }
287
288
289 /** @var Collection $customFields */
290 $customFields = $customFieldRepository->getAll();
291
292 /** @var CustomField $customField */
293 foreach ($customFields->getItems() as $customField) {
294 $customFieldData = array_merge(
295 $customField->toArray(),
296 [
297 'services' => [],
298 'events' => []
299 ]
300 );
301
302 /** @var Service $service */
303 foreach ($customField->getServices()->getItems() as $service) {
304 $customFieldData['services'][] = [
305 'id' => $service->getId()->getValue()
306 ];
307 }
308
309 /** @var Event $event */
310 foreach ($customField->getEvents()->getItems() as $event) {
311 $customFieldData['events'][] = [
312 'id' => $event->getId()->getValue()
313 ];
314 }
315
316 $resultData['customFields'][] = $customFieldData;
317 }
318
319
320 /** @var PackageRepository $packageRepository */
321 $packageRepository = $this->container->get('domain.bookable.package.repository');
322
323 /** @var Collection $packages */
324 $packages = $packageRepository->getByCriteria([]);
325
326 /** @var Package $package */
327 foreach ($packages->getItems() as $package) {
328 $packageData = array_merge(
329 $package->toArray(),
330 ['bookable' => []]
331 );
332
333 /** @var PackageService $bookable */
334 foreach ($package->getBookable()->getItems() as $bookable) {
335 $bookableData = array_merge(
336 $bookable->toArray(),
337 [
338 'service' => ['id' => $bookable->getService()->getId()->getValue()],
339 'providers' => [],
340 'locations' => [],
341 ]
342 );
343
344 /** @var Provider $provider */
345 foreach ($bookable->getProviders()->getItems() as $provider) {
346 $bookableData['providers'][] = [
347 'id' => $provider->getId()->getValue()
348 ];
349 }
350
351 /** @var Location $location */
352 foreach ($bookable->getLocations()->getItems() as $location) {
353 $bookableData['locations'][] = [
354 'id' => $location->getId()->getValue()
355 ];
356 }
357
358 $packageData['bookable'][] = $bookableData;
359 }
360
361 $resultData['packages'][] = $packageData;
362 }
363
364 /** @var Tax $tax */
365 foreach ($taxes->getItems() as $tax) {
366 $taxData = [
367 'id' => $tax->getId()->getValue(),
368 'name' => $tax->getName()->getValue(),
369 'type' => $tax->getType()->getValue(),
370 'amount' => $tax->getAmount()->getValue(),
371 'serviceList' => [],
372 'extraList' => [],
373 'packageList' => [],
374 'eventList' => [],
375 ];
376
377 /** @var Service $service */
378 foreach ($tax->getServiceList()->getItems() as $service) {
379 $taxData['serviceList'][] = [
380 'id' => $service->getId()->getValue(),
381 ];
382 }
383
384 /** @var Extra $extra */
385 foreach ($tax->getExtraList()->getItems() as $extra) {
386 $taxData['extraList'][] = [
387 'id' => $extra->getId()->getValue(),
388 ];
389 }
390
391 /** @var Package $package */
392 foreach ($tax->getPackageList()->getItems() as $package) {
393 $taxData['packageList'][] = [
394 'id' => $package->getId()->getValue(),
395 ];
396 }
397
398 /** @var Event $event */
399 foreach ($tax->getEventList()->getItems() as $event) {
400 $taxData['eventList'][] = [
401 'id' => $event->getId()->getValue(),
402 ];
403 }
404
405 $resultData['taxes'][] = $taxData;
406 }
407
408 $settingsDomainService->setStashEntities($resultData);
409 }
410
411 /**
412 * @return array
413 * @throws InvalidArgumentException
414 */
415 public function getStash()
416 {
417 /** @var ProviderApplicationService $providerAS */
418 $providerAS = $this->container->get('application.user.provider.service');
419
420 /** @var SettingsService $settingsDomainService */
421 $settingsDomainService = $this->container->get('domain.settings.service');
422
423 $entitiesData = $settingsDomainService->getStashEntities();
424
425 if ($entitiesData) {
426 /** @var Collection $locations */
427 $locations = new Collection();
428
429 foreach ($entitiesData['locations'] as $locationData) {
430 $locations->addItem(LocationFactory::create($locationData), $locationData['id']);
431 }
432
433
434 /** @var Collection $services */
435 $services = new Collection();
436
437 foreach ($entitiesData['categories'] as $categoryData) {
438 foreach ($categoryData['serviceList'] as $serviceData) {
439 $services->addItem(ServiceFactory::create($serviceData), $serviceData['id']);
440 }
441 }
442
443
444 /** @var Collection $providers */
445 $providers = new Collection();
446
447 foreach ($entitiesData['employees'] as &$employeeData) {
448 $employeeData['type'] = AbstractUser::USER_ROLE_PROVIDER;
449
450 $providers->addItem(ProviderFactory::create($employeeData), $employeeData['id']);
451
452 unset(
453 $employeeData['email'],
454 $employeeData['weekDayList'],
455 $employeeData['specialDayList'],
456 $employeeData['dayOffList']
457 );
458 }
459
460 $entitiesRelations = [];
461
462 /** @var Provider $provider */
463 foreach ($providers->getItems() as $providerId => $provider) {
464 if ($data = $providerAS->getProviderServiceLocations($provider, $locations, $services)) {
465 $entitiesRelations[$providerId] = $data;
466 }
467 }
468
469 $currentDateTime = DateTimeService::getNowDateTimeObject();
470
471 foreach ($entitiesData['packages'] as &$packageData) {
472 $packageData['available'] =
473 !$packageData['endDate'] ||
474 DateTimeService::getCustomDateTimeObject($packageData['endDate']) > $currentDateTime;
475 }
476
477 $entitiesData['entitiesRelations'] = $entitiesRelations;
478 }
479
480 return $entitiesData;
481 }
482 }
483