Ver código fonte

refactor: add base_prices no retorno do dashboard service + estrutura fallback search por distancia

Gustavo Mantovani 1 semana atrás
pai
commit
52d1b086de

+ 16 - 3
app/Services/DashboardService.php

@@ -200,7 +200,8 @@ class DashboardService
 
         $clientPrimaryAddress = Address::where('source', 'client')
             ->where('source_id', $cliente->id)
-            ->where('is_primary', true)
+            ->orderByDesc('is_primary')
+            ->orderByDesc('id')
             ->first();
 
         $clientDistanceAddress = $this->addressForDistance($cliente->id, $clientPrimaryAddress);
@@ -225,7 +226,11 @@ class DashboardService
                         FROM addresses
                         WHERE source = 'provider'
                         AND deleted_at IS NULL
-                        ORDER BY source_id, is_primary DESC
+                        ORDER BY
+                            source_id,
+                            (latitude IS NOT NULL AND longitude IS NOT NULL) DESC,
+                            is_primary DESC,
+                            id DESC
                     ) AS provider_address
                 "),
                 'provider_address.source_id',
@@ -239,7 +244,10 @@ class DashboardService
                 'providers.profile_media_id'
             )
             ->whereNotNull('provider_address.id')
-            ->where('provider_address.city_id', $clientPrimaryAddress?->city_id)
+            ->when(
+                $clientPrimaryAddress?->city_id,
+                fn ($query, int $cityId) => $query->where('provider_address.city_id', $cityId)
+            )
             ->whereNotIn('providers.id', $blockedProviderIds)
             ->whereIn('providers.id', $providersWithWorkingDays)
             ->whereNull('providers.deleted_at')
@@ -282,6 +290,11 @@ class DashboardService
 
             unset($item->provider_photo_path);
 
+            $item->daily_price_8h_base = $item->daily_price_8h;
+            $item->daily_price_6h_base = $item->daily_price_6h;
+            $item->daily_price_4h_base = $item->daily_price_4h;
+            $item->daily_price_2h_base = $item->daily_price_2h;
+
             $item->daily_price_8h = $this->applyCreditCardFee($item->daily_price_8h);
             $item->daily_price_6h = $this->applyCreditCardFee($item->daily_price_6h);
             $item->daily_price_4h = $this->applyCreditCardFee($item->daily_price_4h);

+ 19 - 6
app/Services/Pagarme/PagarmePaymentService.php

@@ -64,23 +64,36 @@ class PagarmePaymentService
     private function platformFeeRate(string $paymentMethod, ?Schedule $schedule = null): float
     {
         if ($schedule && $this->scheduleBelongsToCartWithAtLeastThreeItems($schedule)) {
-            return (float) config('services.pagarme.platform_cart_min_3_schedules_fee_rate');
+            return $this->configuredPlatformFeeRate('platform_cart_min_3_schedules_fee_rate');
         }
 
         return $paymentMethod === 'credit_card'
-            ? (float) config('services.pagarme.platform_credit_card_fee_rate')
-            : (float) config('services.pagarme.platform_pix_fee_rate');
+            ? $this->configuredPlatformFeeRate('platform_credit_card_fee_rate')
+            : $this->configuredPlatformFeeRate('platform_pix_fee_rate');
     }
 
     public function platformFeeRates(): array
     {
         return [
-            'pix'                  => (float) config('services.pagarme.platform_pix_fee_rate'),
-            'credit_card'          => (float) config('services.pagarme.platform_credit_card_fee_rate'),
-            'cart_min_3_schedules' => (float) config('services.pagarme.platform_cart_min_3_schedules_fee_rate'),
+            'pix'                  => $this->configuredPlatformFeeRate('platform_pix_fee_rate'),
+            'credit_card'          => $this->configuredPlatformFeeRate('platform_credit_card_fee_rate'),
+            'cart_min_3_schedules' => $this->configuredPlatformFeeRate('platform_cart_min_3_schedules_fee_rate'),
         ];
     }
 
+    private function configuredPlatformFeeRate(string $key): float
+    {
+        $rate = config("services.pagarme.{$key}", 0);
+
+        if (is_string($rate)) {
+            $rate = str_replace(',', '.', trim($rate));
+        }
+
+        $rate = (float) $rate;
+
+        return $rate > 1 ? $rate / 100 : $rate;
+    }
+
     public function processPayment(
         Payment  $payment,
         Schedule $schedule,

+ 9 - 0
app/Services/ScheduleService.php

@@ -42,6 +42,15 @@ class ScheduleService
             foreach ($schedules as $schedule) {
                 $datasMerged = array_merge($baseData, $schedule);
 
+                if (($datasMerged['schedule_type'] ?? 'default') === 'default') {
+                    $provider = Provider::findOrFail($datasMerged['provider_id']);
+
+                    $datasMerged['total_amount'] = $this->calculateAmount(
+                        $provider,
+                        (string) $datasMerged['period_type'],
+                    );
+                }
+
                 $this->validateProviderAvailability($datasMerged, null);
 
                 $scheduleData = array_merge($datasMerged, [

+ 15 - 6
app/Services/SearchService.php

@@ -27,7 +27,8 @@ class SearchService
 
         $clientPrimaryAddress = Address::where('source', 'client')
             ->where('source_id', $cliente->id)
-            ->orderBy('is_primary', 'desc')
+            ->orderByDesc('is_primary')
+            ->orderByDesc('id')
             ->first();
 
         $clientDistanceAddress = $this->addressForDistance($cliente->id, $clientPrimaryAddress);
@@ -52,7 +53,11 @@ class SearchService
                         FROM addresses
                         WHERE source = 'provider'
                         AND deleted_at IS NULL
-                        ORDER BY source_id, is_primary DESC
+                        ORDER BY
+                            source_id,
+                            (latitude IS NOT NULL AND longitude IS NOT NULL) DESC,
+                            is_primary DESC,
+                            id DESC
                     ) AS provider_address
                 "),
                 'provider_address.source_id',
@@ -136,10 +141,14 @@ class SearchService
             $arr = is_array($item) ? $item : $item->toArray();
 
             $arr['profile_media_url'] = $mediaUrls[$arr['profile_media_id'] ?? null] ?? null;
-            $arr['daily_price_8h']     = $this->applyCreditCardFee($arr['daily_price_8h'] ?? null);
-            $arr['daily_price_6h']     = $this->applyCreditCardFee($arr['daily_price_6h'] ?? null);
-            $arr['daily_price_4h']     = $this->applyCreditCardFee($arr['daily_price_4h'] ?? null);
-            $arr['daily_price_2h']     = $this->applyCreditCardFee($arr['daily_price_2h'] ?? null);
+            $arr['daily_price_8h_base'] = $arr['daily_price_8h'] ?? null;
+            $arr['daily_price_6h_base'] = $arr['daily_price_6h'] ?? null;
+            $arr['daily_price_4h_base'] = $arr['daily_price_4h'] ?? null;
+            $arr['daily_price_2h_base'] = $arr['daily_price_2h'] ?? null;
+            $arr['daily_price_8h']      = $this->applyCreditCardFee($arr['daily_price_8h'] ?? null);
+            $arr['daily_price_6h']      = $this->applyCreditCardFee($arr['daily_price_6h'] ?? null);
+            $arr['daily_price_4h']      = $this->applyCreditCardFee($arr['daily_price_4h'] ?? null);
+            $arr['daily_price_2h']      = $this->applyCreditCardFee($arr['daily_price_2h'] ?? null);
 
             unset($arr['profile_media_id']);