|
|
@@ -90,6 +90,73 @@ class ServicePackageService
|
|
|
->get();
|
|
|
}
|
|
|
|
|
|
+ public function getByProviderUserId(int $userId): Collection
|
|
|
+ {
|
|
|
+ return ServicePackage::query()
|
|
|
+ ->with(['items.schedule.client.user', 'items.schedule.provider.user', 'items.schedule.address'])
|
|
|
+ ->whereHas('provider', fn ($query) => $query->where('user_id', $userId))
|
|
|
+ ->orderBy('created_at', 'desc')
|
|
|
+ ->get();
|
|
|
+ }
|
|
|
+
|
|
|
+ //
|
|
|
+
|
|
|
+ public function acceptByProvider(int $id, int $userId): ServicePackage
|
|
|
+ {
|
|
|
+ $package = ServicePackage::query()
|
|
|
+ ->with(['items.schedule'])
|
|
|
+ ->whereHas('provider', fn ($query) => $query->where('user_id', $userId))
|
|
|
+ ->findOrFail($id);
|
|
|
+
|
|
|
+ if ($package->status->value !== 'open') {
|
|
|
+ throw ValidationException::withMessages([
|
|
|
+ 'status' => __('messages.service_package_must_be_open_for_changes'),
|
|
|
+ ]);
|
|
|
+ }
|
|
|
+
|
|
|
+ $scheduleService = app(ScheduleService::class);
|
|
|
+
|
|
|
+ DB::transaction(function () use ($package, $scheduleService) {
|
|
|
+ foreach ($package->items as $item) {
|
|
|
+ if ($item->schedule && $item->schedule->status === 'pending') {
|
|
|
+ $scheduleService->updateStatus($item->schedule->id, 'accepted', fromPackage: true);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ return $package->fresh(['items.schedule.client.user', 'items.schedule.provider.user', 'items.schedule.address']);
|
|
|
+ }
|
|
|
+
|
|
|
+ public function refuseByProvider(int $id, int $userId): ServicePackage
|
|
|
+ {
|
|
|
+ $package = ServicePackage::query()
|
|
|
+ ->with(['items.schedule'])
|
|
|
+ ->whereHas('provider', fn ($query) => $query->where('user_id', $userId))
|
|
|
+ ->findOrFail($id);
|
|
|
+
|
|
|
+ if ($package->status->value !== 'open') {
|
|
|
+ throw ValidationException::withMessages([
|
|
|
+ 'status' => __('messages.service_package_must_be_open_for_changes'),
|
|
|
+ ]);
|
|
|
+ }
|
|
|
+
|
|
|
+ $scheduleService = app(ScheduleService::class);
|
|
|
+
|
|
|
+ DB::transaction(function () use ($package, $scheduleService) {
|
|
|
+ foreach ($package->items as $item) {
|
|
|
+ if ($item->schedule && $item->schedule->status === 'pending') {
|
|
|
+ $scheduleService->updateStatus($item->schedule->id, 'rejected', fromPackage: true);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ $package->update(['status' => 'cancelled']);
|
|
|
+ });
|
|
|
+
|
|
|
+ return $package->fresh(['items.schedule.client.user', 'items.schedule.provider.user', 'items.schedule.address']);
|
|
|
+ }
|
|
|
+
|
|
|
+ //
|
|
|
+
|
|
|
public function createForUser(array $data, int $userId): ServicePackage
|
|
|
{
|
|
|
$client = Client::query()
|
|
|
@@ -192,5 +259,4 @@ class ServicePackageService
|
|
|
|
|
|
return (int) $providerIds->first();
|
|
|
}
|
|
|
-
|
|
|
}
|