PluginProbe ʕ •ᴥ•ʔ
Booking for Appointments and Events Calendar – Amelia / 1.2.11
Booking for Appointments and Events Calendar – Amelia v1.2.11
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
475 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
124
125 $entitiesRelations = [];
126
127 /** @var Provider $provider */
128 foreach ($providers->getItems() as $providerId => $provider) {
129 $providerService->setProviderServices($provider, $services, true);
130
131 if ($data = $providerAS->getProviderServiceLocations($provider, $locations, $services, true)) {
132 $entitiesRelations[$providerId] = $data;
133 }
134 }
135
136
137 /** @var Collection $availableLocations */
138 $availableLocations = new Collection();
139
140 /** @var Collection $availableServices */
141 $availableServices = new Collection();
142
143 /** @var Collection $availableProviders */
144 $availableProviders = new Collection();
145
146 foreach ($entitiesRelations as $providerId => $providerServiceRelations) {
147 foreach ($providerServiceRelations as $serviceId => $serviceLocationRelations) {
148 foreach ($serviceLocationRelations as $locationId) {
149 if ($locationId && !$availableLocations->keyExists($locationId)) {
150 $availableLocations->addItem($locations->getItem($locationId), $locationId);
151 }
152 }
153
154 if (!$availableServices->keyExists($serviceId)) {
155 $availableServices->addItem($services->getItem($serviceId), $serviceId);
156 }
157 }
158
159 $availableProviders->addItem($providers->getItem($providerId), $providerId);
160 }
161
162 /** @var \AmeliaBooking\Application\Services\Settings\SettingsService $settingsAS*/
163 $settingsAS = $this->container->get('application.settings.service');
164 $daysOff = $settingsAS->getDaysOff($daysOffNew);
165
166 $resultData = [
167 'categories' => [],
168 'employees' => [],
169 'locations' => [],
170 'customFields' => [],
171 'tags' => [],
172 'packages' => [],
173 'settings' => [
174 'daysOff' => $daysOff
175 ],
176 ];
177
178 /** @var Event $event */
179 foreach ($events->getItems() as $event) {
180 if ($event->getLocationId() && !$availableLocations->keyExists($event->getLocationId()->getValue())) {
181 $availableLocations->addItem(
182 $locations->getItem($event->getLocationId()->getValue()),
183 $event->getLocationId()->getValue()
184 );
185 }
186 }
187
188 /** @var Collection $eventsTags */
189 $eventsTags = $eventTagsRepository->getAllDistinctByCriteria([]);
190
191 $resultData['tags'] = $eventsTags->toArray();
192
193 if ($locations->length() && !$availableLocations->length()) {
194 $settingsDomainService->setStashEntities($resultData);
195
196 return;
197 }
198
199
200 /** @var Location $location */
201 foreach ($availableLocations->getItems() as $location) {
202 $resultData['locations'][] = [
203 'id' => $location->getId()->getValue(),
204 'name' => $location->getName()->getValue(),
205 'status' => $location->getStatus()->getValue(),
206 'address'=> $location->getAddress()->getValue(),
207 'translations' => $location->getTranslations() ? $location->getTranslations()->getValue() : null
208 ];
209 }
210
211
212 /** @var Collection $categories */
213 $categories = $categoryRepository->getAllIndexedById();
214
215 $availableCategories = new Collection();
216
217 /** @var Service $service */
218 foreach ($availableServices->getItems() as $service) {
219 if (!$availableCategories->keyExists($service->getCategoryId()->getValue())) {
220 /** @var Category $category */
221 $category = $categories->getItem($service->getCategoryId()->getValue());
222
223 $category->setServiceList(new Collection());
224
225 $availableCategories->addItem(
226 $category,
227 $service->getCategoryId()->getValue()
228 );
229 }
230
231 /** @var Category $category */
232 $category = $availableCategories->getItem($service->getCategoryId()->getValue());
233
234 $category->getServiceList()->addItem($service, $service->getId()->getValue());
235 }
236
237 $resultData['categories'] = $availableCategories->toArray();
238
239
240 /** @var Provider $provider */
241 foreach ($availableProviders->getItems() as $provider) {
242 $providerData = [
243 'id' => $provider->getId()->getValue(),
244 'firstName' => $provider->getFirstName()->getValue(),
245 'lastName' => $provider->getLastName()->getValue(),
246 'email' => $provider->getEmail()->getValue(),
247 'status' => $provider->getStatus()->getValue(),
248 'pictureFullPath' => $provider->getPicture() ? $provider->getPicture()->getFullPath() : null,
249 'pictureThumbPath' => $provider->getPicture() ? $provider->getPicture()->getThumbPath() : null,
250 'locationId' => $provider->getLocationId() ? $provider->getLocationId()->getValue() : null,
251 'serviceList' => [],
252 'weekDayList' => $provider->getWeekDayList()->toArray(),
253 'dayOffList' => $provider->getDayOffList()->toArray(),
254 'specialDayList' => $provider->getSpecialDayList()->toArray(),
255 'translations' => $provider->getTranslations() ? $provider->getTranslations()->getValue() : null,
256 'description' => $provider->getDescription() ? $provider->getDescription()->getValue() : null,
257 'badgeId' => $provider->getBadgeId() ? $provider->getBadgeId()->getValue() : null,
258 ];
259
260 /** @var Service $service */
261 foreach ($provider->getServiceList()->getItems() as $service) {
262 if ($availableServices->keyExists($service->getId()->getValue())) {
263 $providerData['serviceList'][] = [
264 'id' => $service->getId()->getValue(),
265 'price' => $service->getPrice()->getValue(),
266 'duration' => $service->getDuration()->getValue(),
267 'customPricing' => $service->getCustomPricing()
268 ? $service->getCustomPricing()->getValue() : null,
269 'minCapacity' => $service->getMinCapacity()->getValue(),
270 'maxCapacity' => $service->getMaxCapacity()->getValue(),
271 'status' => $service->getStatus()->getValue(),
272 'categoryId' => $service->getCategoryId()->getValue()
273 ];
274 }
275 }
276
277 $resultData['employees'][] = $providerData;
278 }
279
280
281 /** @var Collection $customFields */
282 $customFields = $customFieldRepository->getAll();
283
284 /** @var CustomField $customField */
285 foreach ($customFields->getItems() as $customField) {
286 $customFieldData = array_merge(
287 $customField->toArray(),
288 [
289 'services' => [],
290 'events' => []
291 ]
292 );
293
294 /** @var Service $service */
295 foreach ($customField->getServices()->getItems() as $service) {
296 $customFieldData['services'][] = [
297 'id' => $service->getId()->getValue()
298 ];
299 }
300
301 /** @var Event $event */
302 foreach ($customField->getEvents()->getItems() as $event) {
303 $customFieldData['events'][] = [
304 'id' => $event->getId()->getValue()
305 ];
306 }
307
308 $resultData['customFields'][] = $customFieldData;
309 }
310
311
312 /** @var PackageRepository $packageRepository */
313 $packageRepository = $this->container->get('domain.bookable.package.repository');
314
315 /** @var Collection $packages */
316 $packages = $packageRepository->getByCriteria([]);
317
318 /** @var Package $package */
319 foreach ($packages->getItems() as $package) {
320 $packageData = array_merge(
321 $package->toArray(),
322 ['bookable' => []]
323 );
324
325 /** @var PackageService $bookable */
326 foreach ($package->getBookable()->getItems() as $bookable) {
327 $bookableData = array_merge(
328 $bookable->toArray(),
329 [
330 'service' => ['id' => $bookable->getService()->getId()->getValue()],
331 'providers' => [],
332 'locations' => [],
333 ]
334 );
335
336 /** @var Provider $provider */
337 foreach ($bookable->getProviders()->getItems() as $provider) {
338 $bookableData['providers'][] = [
339 'id' => $provider->getId()->getValue()
340 ];
341 }
342
343 /** @var Location $location */
344 foreach ($bookable->getLocations()->getItems() as $location) {
345 $bookableData['locations'][] = [
346 'id' => $location->getId()->getValue()
347 ];
348 }
349
350 $packageData['bookable'][] = $bookableData;
351 }
352
353 $resultData['packages'][] = $packageData;
354 }
355
356 /** @var Tax $tax */
357 foreach ($taxes->getItems() as $tax) {
358 $taxData = [
359 'id' => $tax->getId()->getValue(),
360 'name' => $tax->getName()->getValue(),
361 'type' => $tax->getType()->getValue(),
362 'amount' => $tax->getAmount()->getValue(),
363 'serviceList' => [],
364 'extraList' => [],
365 'packageList' => [],
366 'eventList' => [],
367 ];
368
369 /** @var Service $service */
370 foreach ($tax->getServiceList()->getItems() as $service) {
371 $taxData['serviceList'][] = [
372 'id' => $service->getId()->getValue(),
373 ];
374 }
375
376 /** @var Extra $extra */
377 foreach ($tax->getExtraList()->getItems() as $extra) {
378 $taxData['extraList'][] = [
379 'id' => $extra->getId()->getValue(),
380 ];
381 }
382
383 /** @var Package $package */
384 foreach ($tax->getPackageList()->getItems() as $package) {
385 $taxData['packageList'][] = [
386 'id' => $package->getId()->getValue(),
387 ];
388 }
389
390 /** @var Event $event */
391 foreach ($tax->getEventList()->getItems() as $event) {
392 $taxData['eventList'][] = [
393 'id' => $event->getId()->getValue(),
394 ];
395 }
396
397 $resultData['taxes'][] = $taxData;
398 }
399
400 $settingsDomainService->setStashEntities($resultData);
401 }
402
403 /**
404 * @return array
405 * @throws InvalidArgumentException
406 */
407 public function getStash()
408 {
409 /** @var ProviderApplicationService $providerAS */
410 $providerAS = $this->container->get('application.user.provider.service');
411
412 /** @var SettingsService $settingsDomainService */
413 $settingsDomainService = $this->container->get('domain.settings.service');
414
415 $entitiesData = $settingsDomainService->getStashEntities();
416
417 if ($entitiesData) {
418 /** @var Collection $locations */
419 $locations = new Collection();
420
421 foreach ($entitiesData['locations'] as $locationData) {
422 $locations->addItem(LocationFactory::create($locationData), $locationData['id']);
423 }
424
425
426 /** @var Collection $services */
427 $services = new Collection();
428
429 foreach ($entitiesData['categories'] as $categoryData) {
430 foreach ($categoryData['serviceList'] as $serviceData) {
431 $services->addItem(ServiceFactory::create($serviceData), $serviceData['id']);
432 }
433 }
434
435
436 /** @var Collection $providers */
437 $providers = new Collection();
438
439 foreach ($entitiesData['employees'] as &$employeeData) {
440 $employeeData['type'] = AbstractUser::USER_ROLE_PROVIDER;
441
442 $providers->addItem(ProviderFactory::create($employeeData), $employeeData['id']);
443
444 unset(
445 $employeeData['email'],
446 $employeeData['weekDayList'],
447 $employeeData['specialDayList'],
448 $employeeData['dayOffList']
449 );
450 }
451
452 $entitiesRelations = [];
453
454 /** @var Provider $provider */
455 foreach ($providers->getItems() as $providerId => $provider) {
456 if ($data = $providerAS->getProviderServiceLocations($provider, $locations, $services)) {
457 $entitiesRelations[$providerId] = $data;
458 }
459 }
460
461 $currentDateTime = DateTimeService::getNowDateTimeObject();
462
463 foreach ($entitiesData['packages'] as &$packageData) {
464 $packageData['available'] =
465 !$packageData['endDate'] ||
466 DateTimeService::getCustomDateTimeObject($packageData['endDate']) > $currentDateTime;
467 }
468
469 $entitiesData['entitiesRelations'] = $entitiesRelations;
470 }
471
472 return $entitiesData;
473 }
474 }
475