ProviderSeeder.php 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441
  1. <?php
  2. namespace Database\Seeders;
  3. use App\Enums\ApprovalStatusEnum;
  4. use App\Enums\UserTypeEnum;
  5. use App\Enums\WorkingPeriodEnum;
  6. use App\Models\Address;
  7. use App\Models\City;
  8. use App\Models\Provider;
  9. use App\Models\ProviderServicesType;
  10. use App\Models\ProviderSpeciality;
  11. use App\Models\ProviderWorkingDay;
  12. use App\Models\ServiceType;
  13. use App\Models\Speciality;
  14. use App\Models\State;
  15. use App\Models\User;
  16. use Illuminate\Database\Seeder;
  17. use Illuminate\Support\Facades\DB;
  18. class ProviderSeeder extends Seeder
  19. {
  20. public function run(): void
  21. {
  22. $providers = [
  23. [
  24. 'user' => [
  25. 'name' => 'Prestador Teste',
  26. 'email' => 'prestador.teste@softpar.inf.br',
  27. 'phone' => '11990000001',
  28. 'code' => '100001',
  29. 'password' => 'S@ft2080.',
  30. 'type' => UserTypeEnum::PROVIDER,
  31. 'email_verified_at' => now(),
  32. 'validated_code' => true,
  33. 'registration_complete' => true,
  34. ],
  35. 'provider' => [
  36. 'document' => '52998224725',
  37. 'rg' => '12.345.678-9',
  38. 'birth_date' => '1988-03-12',
  39. 'average_rating' => 4.9,
  40. 'total_services' => 128,
  41. 'selfie_verified' => true,
  42. 'document_verified' => true,
  43. 'approval_status' => ApprovalStatusEnum::ACCEPTED,
  44. 'daily_price_8h' => 180.00,
  45. 'daily_price_6h' => 140.00,
  46. 'daily_price_4h' => 110.00,
  47. 'daily_price_2h' => 80.00,
  48. ],
  49. 'address' => [
  50. 'zip_code' => '01001000',
  51. 'address' => 'Praça da Sé',
  52. 'number' => '100',
  53. 'district' => 'Sé',
  54. 'complement' => 'Sala 12',
  55. 'nickname' => 'Base Centro',
  56. 'instructions' => 'Atendimento pela portaria principal.',
  57. 'state_code' => 'SP',
  58. 'city_name' => 'São Paulo',
  59. 'address_type' => 'home',
  60. 'is_primary' => true,
  61. 'latitude' => -23.550520,
  62. 'longitude' => -46.633308,
  63. ],
  64. 'service_types' => [
  65. 'Limpeza residencial',
  66. 'Passadoria',
  67. 'Organização de ambientes',
  68. ],
  69. 'specialities' => [
  70. 'Casa',
  71. 'Apartamento',
  72. 'Banheiro',
  73. ],
  74. 'working_days' => [
  75. ['day' => 1, 'period' => WorkingPeriodEnum::MORNING->value],
  76. ['day' => 2, 'period' => WorkingPeriodEnum::MORNING->value],
  77. ['day' => 3, 'period' => WorkingPeriodEnum::MORNING->value],
  78. ['day' => 4, 'period' => WorkingPeriodEnum::MORNING->value],
  79. ['day' => 5, 'period' => WorkingPeriodEnum::MORNING->value],
  80. ],
  81. ],
  82. [
  83. 'user' => [
  84. 'name' => 'Mariana Souza',
  85. 'email' => 'mariana.souza@softpar.inf.br',
  86. 'phone' => '11990000002',
  87. 'code' => '100002',
  88. 'password' => 'S@ft2080.',
  89. 'type' => UserTypeEnum::PROVIDER,
  90. 'email_verified_at' => now(),
  91. 'validated_code' => true,
  92. 'registration_complete' => true,
  93. ],
  94. 'provider' => [
  95. 'document' => '11144477735',
  96. 'rg' => '21.456.789-0',
  97. 'birth_date' => '1991-07-24',
  98. 'average_rating' => 4.7,
  99. 'total_services' => 96,
  100. 'selfie_verified' => true,
  101. 'document_verified' => true,
  102. 'approval_status' => ApprovalStatusEnum::ACCEPTED,
  103. 'daily_price_8h' => 210.00,
  104. 'daily_price_6h' => 160.00,
  105. 'daily_price_4h' => 120.00,
  106. 'daily_price_2h' => 90.00,
  107. ],
  108. 'address' => [
  109. 'zip_code' => '20040002',
  110. 'address' => 'Avenida Rio Branco',
  111. 'number' => '120',
  112. 'district' => 'Centro',
  113. 'complement' => '8 andar',
  114. 'nickname' => 'Base Centro RJ',
  115. 'instructions' => 'Recepção no térreo.',
  116. 'state_code' => 'RJ',
  117. 'city_name' => 'Rio de Janeiro',
  118. 'address_type' => 'home',
  119. 'is_primary' => true,
  120. 'latitude' => -22.906847,
  121. 'longitude' => -43.172896,
  122. ],
  123. 'service_types' => [
  124. 'Limpeza comercial',
  125. 'Limpeza pós-obra',
  126. ],
  127. 'specialities' => [
  128. 'Escritório',
  129. 'Vidros',
  130. 'Faxina pesada',
  131. ],
  132. 'working_days' => [
  133. ['day' => 1, 'period' => WorkingPeriodEnum::MORNING->value],
  134. ['day' => 2, 'period' => WorkingPeriodEnum::MORNING->value],
  135. ['day' => 3, 'period' => WorkingPeriodEnum::MORNING->value],
  136. ['day' => 4, 'period' => WorkingPeriodEnum::MORNING->value],
  137. ['day' => 5, 'period' => WorkingPeriodEnum::MORNING->value],
  138. ['day' => 6, 'period' => WorkingPeriodEnum::MORNING->value],
  139. ],
  140. ],
  141. [
  142. 'user' => [
  143. 'name' => 'Ana Costa',
  144. 'email' => 'ana.costa@softpar.inf.br',
  145. 'phone' => '11990000003',
  146. 'code' => '100003',
  147. 'password' => 'S@ft2080.',
  148. 'type' => UserTypeEnum::PROVIDER,
  149. 'email_verified_at' => now(),
  150. 'validated_code' => true,
  151. 'registration_complete' => true,
  152. ],
  153. 'provider' => [
  154. 'document' => '16899535009',
  155. 'rg' => '32.987.654-1',
  156. 'birth_date' => '1987-11-03',
  157. 'average_rating' => 4.8,
  158. 'total_services' => 142,
  159. 'selfie_verified' => true,
  160. 'document_verified' => true,
  161. 'approval_status' => ApprovalStatusEnum::ACCEPTED,
  162. 'daily_price_8h' => 170.00,
  163. 'daily_price_6h' => 130.00,
  164. 'daily_price_4h' => 100.00,
  165. 'daily_price_2h' => 70.00,
  166. ],
  167. 'address' => [
  168. 'zip_code' => '30140071',
  169. 'address' => 'Avenida Afonso Pena',
  170. 'number' => '500',
  171. 'district' => 'Centro',
  172. 'complement' => 'Conjunto 1205',
  173. 'nickname' => 'Base BH',
  174. 'instructions' => 'Entrada pela lateral do edifício.',
  175. 'state_code' => 'MG',
  176. 'city_name' => 'Belo Horizonte',
  177. 'address_type' => 'home',
  178. 'is_primary' => true,
  179. 'latitude' => -19.916681,
  180. 'longitude' => -43.934493,
  181. ],
  182. 'service_types' => [
  183. 'Lavanderia',
  184. 'Passadoria',
  185. 'Organização de ambientes',
  186. ],
  187. 'specialities' => [
  188. 'Closet',
  189. 'Cozinha',
  190. 'Lavanderia',
  191. ],
  192. 'working_days' => [
  193. ['day' => 2, 'period' => WorkingPeriodEnum::AFTERNOON->value],
  194. ['day' => 3, 'period' => WorkingPeriodEnum::AFTERNOON->value],
  195. ['day' => 4, 'period' => WorkingPeriodEnum::AFTERNOON->value],
  196. ['day' => 5, 'period' => WorkingPeriodEnum::AFTERNOON->value],
  197. ['day' => 6, 'period' => WorkingPeriodEnum::MORNING->value],
  198. ],
  199. ],
  200. [
  201. 'user' => [
  202. 'name' => 'Juliana Lima',
  203. 'email' => 'juliana.lima@softpar.inf.br',
  204. 'phone' => '11990000004',
  205. 'code' => '100004',
  206. 'password' => 'S@ft2080.',
  207. 'type' => UserTypeEnum::PROVIDER,
  208. 'email_verified_at' => now(),
  209. 'validated_code' => true,
  210. 'registration_complete' => true,
  211. ],
  212. 'provider' => [
  213. 'document' => '12345678909',
  214. 'rg' => '45.321.987-6',
  215. 'birth_date' => '1993-02-15',
  216. 'average_rating' => 4.6,
  217. 'total_services' => 87,
  218. 'selfie_verified' => true,
  219. 'document_verified' => true,
  220. 'approval_status' => ApprovalStatusEnum::ACCEPTED,
  221. 'daily_price_8h' => 190.00,
  222. 'daily_price_6h' => 150.00,
  223. 'daily_price_4h' => 115.00,
  224. 'daily_price_2h' => 75.00,
  225. ],
  226. 'address' => [
  227. 'zip_code' => '80010020',
  228. 'address' => 'Rua XV de Novembro',
  229. 'number' => '250',
  230. 'district' => 'Centro',
  231. 'complement' => 'Sala 3',
  232. 'nickname' => 'Base Curitiba',
  233. 'instructions' => 'Subir até o segundo andar.',
  234. 'state_code' => 'PR',
  235. 'city_name' => 'Curitiba',
  236. 'address_type' => 'home',
  237. 'is_primary' => true,
  238. 'latitude' => -25.428356,
  239. 'longitude' => -49.273251,
  240. ],
  241. 'service_types' => [
  242. 'Limpeza residencial',
  243. 'Limpeza pós-obra',
  244. 'Lavanderia',
  245. ],
  246. 'specialities' => [
  247. 'Casa',
  248. 'Apartamento',
  249. 'Organização de ambientes',
  250. ],
  251. 'working_days' => [
  252. ['day' => 1, 'period' => WorkingPeriodEnum::MORNING->value],
  253. ['day' => 2, 'period' => WorkingPeriodEnum::MORNING->value],
  254. ['day' => 3, 'period' => WorkingPeriodEnum::MORNING->value],
  255. ['day' => 4, 'period' => WorkingPeriodEnum::MORNING->value],
  256. ['day' => 5, 'period' => WorkingPeriodEnum::AFTERNOON->value],
  257. ],
  258. ],
  259. [
  260. 'user' => [
  261. 'name' => 'Renata Alves',
  262. 'email' => 'renata.alves@softpar.inf.br',
  263. 'phone' => '11990000005',
  264. 'code' => '100005',
  265. 'password' => 'S@ft2080.',
  266. 'type' => UserTypeEnum::PROVIDER,
  267. 'email_verified_at' => now(),
  268. 'validated_code' => true,
  269. 'registration_complete' => true,
  270. ],
  271. 'provider' => [
  272. 'document' => '93541134780',
  273. 'rg' => '58.741.236-4',
  274. 'birth_date' => '1990-09-08',
  275. 'average_rating' => 4.5,
  276. 'total_services' => 75,
  277. 'selfie_verified' => true,
  278. 'document_verified' => true,
  279. 'approval_status' => ApprovalStatusEnum::ACCEPTED,
  280. 'daily_price_8h' => 175.00,
  281. 'daily_price_6h' => 135.00,
  282. 'daily_price_4h' => 105.00,
  283. 'daily_price_2h' => 65.00,
  284. ],
  285. 'address' => [
  286. 'zip_code' => '90010010',
  287. 'address' => 'Avenida Borges de Medeiros',
  288. 'number' => '700',
  289. 'district' => 'Centro Histórico',
  290. 'complement' => 'Andar 6',
  291. 'nickname' => 'Base POA',
  292. 'instructions' => 'Interfone para o bloco B.',
  293. 'state_code' => 'RS',
  294. 'city_name' => 'Porto Alegre',
  295. 'address_type' => 'home',
  296. 'is_primary' => true,
  297. 'latitude' => -30.034647,
  298. 'longitude' => -51.217659,
  299. ],
  300. 'service_types' => [
  301. 'Limpeza residencial',
  302. 'Limpeza comercial',
  303. ],
  304. 'specialities' => [
  305. 'Escritório',
  306. 'Cozinha',
  307. 'Banheiro',
  308. ],
  309. 'working_days' => [
  310. ['day' => 1, 'period' => WorkingPeriodEnum::AFTERNOON->value],
  311. ['day' => 2, 'period' => WorkingPeriodEnum::AFTERNOON->value],
  312. ['day' => 3, 'period' => WorkingPeriodEnum::AFTERNOON->value],
  313. ['day' => 4, 'period' => WorkingPeriodEnum::AFTERNOON->value],
  314. ['day' => 5, 'period' => WorkingPeriodEnum::AFTERNOON->value],
  315. ],
  316. ],
  317. ];
  318. DB::transaction(function () use ($providers): void {
  319. foreach ($providers as $data) {
  320. $user = User::updateOrCreate(
  321. ['email' => $data['user']['email']],
  322. $data['user']
  323. );
  324. $provider = Provider::updateOrCreate(
  325. ['user_id' => $user->id],
  326. $data['provider'] + [
  327. 'user_id' => $user->id,
  328. ]
  329. );
  330. $this->seedAddress($provider->id, $data['address']);
  331. $this->seedProviderServicesTypes($provider->id, $data['service_types']);
  332. $this->seedProviderSpecialities($provider->id, $data['specialities']);
  333. $this->seedProviderWorkingDays($provider->id, $data['working_days']);
  334. }
  335. });
  336. }
  337. private function seedAddress(int $providerId, array $data): void
  338. {
  339. $state = State::query()
  340. ->whereRaw('LOWER(code) = ?', [mb_strtolower($data['state_code'])])
  341. ->first();
  342. $city = null;
  343. if ($state) {
  344. $city = City::query()
  345. ->where('state_id', $state->id)
  346. ->whereRaw('LOWER(name) = ?', [mb_strtolower($data['city_name'])])
  347. ->first();
  348. }
  349. Address::updateOrCreate(
  350. [
  351. 'source' => 'provider',
  352. 'source_id' => $providerId,
  353. ],
  354. [
  355. 'zip_code' => $data['zip_code'],
  356. 'address' => $data['address'],
  357. 'number' => $data['number'] ?? null,
  358. 'district' => $data['district'] ?? null,
  359. 'has_complement' => ! empty($data['complement']),
  360. 'complement' => $data['complement'] ?? null,
  361. 'nickname' => $data['nickname'] ?? null,
  362. 'instructions' => $data['instructions'] ?? null,
  363. 'city_id' => $city?->id,
  364. 'state_id' => $state?->id,
  365. 'address_type' => $data['address_type'] ?? 'home',
  366. 'is_primary' => $data['is_primary'] ?? true,
  367. 'latitude' => $data['latitude'] ?? null,
  368. 'longitude' => $data['longitude'] ?? null,
  369. ]
  370. );
  371. }
  372. private function seedProviderServicesTypes(int $providerId, array $descriptions): void
  373. {
  374. $serviceTypeIds = ServiceType::query()
  375. ->whereIn('description', $descriptions)
  376. ->pluck('id')
  377. ->all();
  378. foreach ($serviceTypeIds as $serviceTypeId) {
  379. ProviderServicesType::updateOrCreate(
  380. [
  381. 'provider_id' => $providerId,
  382. 'service_type_id' => $serviceTypeId,
  383. ],
  384. [
  385. 'provider_id' => $providerId,
  386. 'service_type_id' => $serviceTypeId,
  387. ]
  388. );
  389. }
  390. }
  391. private function seedProviderSpecialities(int $providerId, array $descriptions): void
  392. {
  393. $specialityIds = Speciality::query()
  394. ->whereIn('description', $descriptions)
  395. ->pluck('id')
  396. ->all();
  397. foreach ($specialityIds as $specialityId) {
  398. ProviderSpeciality::updateOrCreate(
  399. [
  400. 'provider_id' => $providerId,
  401. 'speciality_id' => $specialityId,
  402. ],
  403. [
  404. 'provider_id' => $providerId,
  405. 'speciality_id' => $specialityId,
  406. ]
  407. );
  408. }
  409. }
  410. private function seedProviderWorkingDays(int $providerId, array $workingDays): void
  411. {
  412. foreach ($workingDays as $workingDay) {
  413. ProviderWorkingDay::updateOrCreate(
  414. [
  415. 'provider_id' => $providerId,
  416. 'day' => $workingDay['day'],
  417. 'period' => $workingDay['period'],
  418. ],
  419. [
  420. 'provider_id' => $providerId,
  421. 'day' => $workingDay['day'],
  422. 'period' => $workingDay['period'],
  423. ]
  424. );
  425. }
  426. }
  427. }