DashboardService.php 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. <?php
  2. namespace App\Services;
  3. use App\Models\Address;
  4. use App\Models\Client;
  5. use App\Models\ClientFavoriteProvider;
  6. use App\Models\Provider;
  7. use App\Models\Review;
  8. use App\Models\Schedule;
  9. use Illuminate\Support\Facades\Auth;
  10. use Illuminate\Support\Facades\DB;
  11. use Illuminate\Support\Facades\Log;
  12. class DashboardService
  13. {
  14. public function __construct() {}
  15. public function dadosDashboardCliente(): array
  16. {
  17. $user = Auth::user();
  18. $cliente = Client::where('user_id', $user->id)->first();
  19. $headerBar = [
  20. 'rating' => $cliente->average_rating,
  21. 'total_ratings' => Review::where('reviews.origin', 'provider')->leftJoin('schedules', 'schedules.id', '=', 'reviews.schedule_id')->where('schedules.client_id', $cliente->id)->count(),
  22. 'total_services' => $cliente->total_services,
  23. ];
  24. $address = Address::where('source', 'client')->where('source_id', $cliente->id)->with(['city', 'state'])->first();
  25. $summaryInfos = [
  26. 'name' => $user->name,
  27. 'address' => $address,
  28. 'pending_services' => Schedule::where('client_id', $cliente->id)->where('status', 'pending')->count(),
  29. ];
  30. Log::info($address);
  31. $nextSchedules = Schedule::with('address:district,address,number,source_id,source,id,address_type')
  32. ->where('schedules.client_id', $cliente->id)
  33. ->whereIn('schedules.status', ['accepted', 'paid'])
  34. ->leftJoin('providers', 'providers.id', '=', 'schedules.provider_id')
  35. ->leftJoin('users as provider_user', 'provider_user.id', '=', 'providers.user_id')
  36. // ->where('schedules.date', '>=', now()->toDateString())
  37. ->select(
  38. 'schedules.id',
  39. 'provider_user.name as provider_name',
  40. 'schedules.date',
  41. 'schedules.start_time',
  42. 'schedules.end_time',
  43. 'schedules.total_amount',
  44. 'schedules.period_type',
  45. 'schedules.schedule_type',
  46. 'schedules.address_id',
  47. )
  48. ->orderBy('schedules.date', 'asc')
  49. ->get();
  50. $lastDoneSchedules = Schedule::where('schedules.client_id', $cliente->id)
  51. ->where('schedules.status', 'finished')
  52. ->leftJoin('providers', 'providers.id', '=', 'schedules.provider_id')
  53. ->leftJoin('users as provider_user', 'provider_user.id', '=', 'providers.user_id')
  54. ->select(
  55. 'schedules.id',
  56. 'provider_user.name as provider_name',
  57. )
  58. ->orderBy('schedules.date', 'desc')
  59. ->limit(5)
  60. ->get();
  61. $favoriteProviders = ClientFavoriteProvider::where('client_id', $cliente->id)
  62. ->leftJoin('providers', 'providers.id', '=', 'client_favorite_providers.provider_id')
  63. ->leftJoin('users as provider_user', 'provider_user.id', '=', 'providers.user_id')
  64. ->select(
  65. 'providers.id',
  66. 'provider_user.name as provider_name',
  67. 'providers.average_rating',
  68. )
  69. ->get();
  70. $providersClose = Provider::leftJoin('users as provider_user', 'provider_user.id', '=', 'providers.user_id')
  71. ->leftJoin('addresses as provider_address', function ($join) {
  72. $join->on('provider_address.source_id', '=', 'providers.id')
  73. ->where('provider_address.source', 'provider');
  74. })
  75. ->leftJoin('addresses as client_address', function ($join) use ($cliente) {
  76. $join->where('client_address.source_id', $cliente->id)
  77. ->where('client_address.source', 'client');
  78. })
  79. ->whereColumn('provider_address.city_id', '=', 'client_address.city_id')
  80. ->select(
  81. 'providers.id',
  82. 'provider_user.name as provider_name',
  83. 'provider_address.district', // refatorar para pegar o bairro
  84. 'providers.average_rating',
  85. DB::raw("(SELECT COUNT(*) FROM reviews LEFT JOIN schedules ON schedules.id = reviews.schedule_id WHERE reviews.origin = 'provider' AND schedules.provider_id = providers.id) as total_reviews"),
  86. 'providers.total_services',
  87. 'providers.daily_price_8h',
  88. 'providers.daily_price_6h',
  89. 'providers.daily_price_4h',
  90. 'providers.daily_price_2h',
  91. )
  92. ->get();
  93. return [
  94. 'headerBar' => $headerBar,
  95. 'summaryInfos' => $summaryInfos,
  96. 'nextSchedules' => $nextSchedules,
  97. 'lastDoneSchedules' => $lastDoneSchedules,
  98. 'favoriteProviders' => $favoriteProviders,
  99. 'providersClose' => $providersClose,
  100. ];
  101. }
  102. public function dadosDashboardPrestador(): array
  103. {
  104. $user = Auth::user();
  105. $provider = Provider::where('user_id', $user->id)->first();
  106. Log::info($provider);
  107. $headerBar = [
  108. 'rating' => $provider->average_rating,
  109. 'total_ratings' => Review::where('reviews.origin', 'client')->leftJoin('schedules', 'schedules.id', '=', 'reviews.schedule_id')->where('schedules.provider_id', $provider->id)->count(),
  110. 'total_services' => $provider->total_services,
  111. ];
  112. $address = Address::where('source', 'provider')->where('source_id', $provider->id)->with(['city', 'state'])->first();
  113. Log::info($address);
  114. $summaryInfos = [
  115. 'name' => $user->name,
  116. 'address' => $address,
  117. 'pending_services' => Schedule::where('provider_id', $provider->id)->where('status', 'pending')->count(),
  118. ];
  119. $priceSuggestedAvg = Provider::where('user_id', '!=', $user->id)
  120. ->whereNotNull('daily_price_8h')
  121. ->pluck('daily_price_8h')
  122. ->avg();
  123. $priceActual = $provider->daily_price_8h;
  124. $priceSuggested = [
  125. 'average_price' => $priceSuggestedAvg,
  126. 'your_price' => $priceActual,
  127. ];
  128. $solicitations = Schedule::with('address:district,source_id,source,id')
  129. ->where('schedules.provider_id', $provider->id)
  130. ->where('schedules.status', 'pending')
  131. ->leftJoin('clients', 'clients.id', '=', 'schedules.client_id')
  132. ->leftJoin('users as client_user', 'client_user.id', '=', 'clients.user_id')
  133. ->select(
  134. 'schedules.id',
  135. 'client_user.name as client_name',
  136. 'clients.average_rating',
  137. 'schedules.date',
  138. DB::raw("TO_CHAR(schedules.date, 'DD/MM/YYYY') as formatted_date"),
  139. 'schedules.start_time',
  140. 'schedules.end_time',
  141. 'schedules.total_amount',
  142. 'schedules.period_type',
  143. 'schedules.schedule_type',
  144. 'schedules.address_id',
  145. DB::raw("CASE
  146. WHEN (now() - schedules.created_at) < INTERVAL '1 day' THEN CONCAT(ROUND(EXTRACT(EPOCH FROM (now() - schedules.created_at)) / 3600), ' hours ago')
  147. ELSE CONCAT(ROUND(EXTRACT(EPOCH FROM (now() - schedules.created_at)) / 86400), ' days ago')
  148. END as time_since_request"),
  149. )
  150. ->orderBy('schedules.date', 'asc')
  151. ->get();
  152. $nextSchedules = Schedule::with('address:district,address,number,source_id,source,id')
  153. ->where('schedules.provider_id', $provider->id)
  154. ->whereIn('schedules.status', ['accepted', 'paid'])
  155. ->leftJoin('clients', 'clients.id', '=', 'schedules.client_id')
  156. ->leftJoin('users as client_user', 'client_user.id', '=', 'clients.user_id')
  157. ->leftJoin('custom_schedules', 'custom_schedules.schedule_id', '=', 'schedules.id')
  158. ->select(
  159. 'schedules.id',
  160. 'client_user.name as client_name',
  161. 'schedules.date',
  162. 'schedules.start_time',
  163. 'schedules.end_time',
  164. 'schedules.total_amount',
  165. 'schedules.period_type',
  166. 'schedules.address_id',
  167. 'schedules.schedule_type',
  168. 'custom_schedules.offers_meal',
  169. )
  170. ->orderBy('schedules.date', 'asc')
  171. ->get();
  172. $opportunities = Schedule::with('address:district,source_id,source,id')
  173. ->where('schedules.schedule_type', 'custom')
  174. ->where('schedules.status', 'pending')
  175. ->leftJoin('clients', 'clients.id', '=', 'schedules.client_id')
  176. ->leftJoin('users as client_user', 'client_user.id', '=', 'clients.user_id')
  177. ->leftJoin('custom_schedules', 'custom_schedules.schedule_id', '=', 'schedules.id')
  178. ->select(
  179. 'schedules.id',
  180. 'client_user.name as client_name',
  181. 'clients.average_rating',
  182. 'schedules.date',
  183. 'schedules.start_time',
  184. 'schedules.end_time',
  185. 'schedules.period_type',
  186. 'schedules.schedule_type',
  187. 'schedules.address_id',
  188. 'custom_schedules.address_type'
  189. )
  190. ->orderBy('schedules.date', 'asc')
  191. ->get();
  192. $opportunities = $opportunities->map(function ($item) use ($provider) {
  193. $price = 0;
  194. switch ($item->period_type) {
  195. case 2:
  196. $price = $provider->daily_price_2h;
  197. break;
  198. case 4:
  199. $price = $provider->daily_price_4h;
  200. break;
  201. case 6:
  202. $price = $provider->daily_price_6h;
  203. break;
  204. case 8:
  205. $price = $provider->daily_price_8h;
  206. break;
  207. }
  208. $item->total_amount = $price;
  209. return $item;
  210. });
  211. return [
  212. 'headerBar' => $headerBar,
  213. 'summaryInfos' => $summaryInfos,
  214. 'priceSuggested' => $priceSuggested,
  215. 'solicitations' => $solicitations,
  216. 'nextSchedules' => $nextSchedules,
  217. 'opportunities' => $opportunities,
  218. ];
  219. }
  220. }