Skip to content

Commit f439d32

Browse files
Leia o Readme com os itens a serem feitos - Fiz a Correção de Bug no relacionamento do Endereço do Cliente
1 parent 1e129cb commit f439d32

File tree

6 files changed

+86
-48
lines changed

6 files changed

+86
-48
lines changed

README.md

+14-9
Original file line numberDiff line numberDiff line change
@@ -49,18 +49,19 @@
4949
- FEITO WALLACE - Ajuste no filtro da resource de tickts (Organização do Layout / Inclusão query de busca pro enum)
5050
- FEITO WALLACE - Implantação parcial das models (Inventory / manufacturer/ review)
5151
- FEITO WALLACE - Identação das resources e models criadas (Retirada de espaços em branco)
52+
- FEITO WALLACE - Revisão das dúvidas
53+
- FEITO WALLACE - Implementação resource de estoque e controle de iventario.
54+
- FEITO WALLACE - Conceitos de Action Table e "Serviços Internos".
55+
- FEITO WALLACE - Conceitos de disparo de email.
5256

53-
# Atividades para executar (26/01/25):
57+
# Atividades Realizadas (28/01/25):
5458

55-
1. Revisão das dúvidas
59+
- Correção de Bug na model de Tickets (Relacionamento com a UserAddresses estava incorreto) **_Veja comentado na Model Ticket_**
5660

57-
2. Implementação resource de estoque e controle de iventario.
58-
59-
3. Implementação da avaliação de ticket.
60-
61-
4. Conceitos de Action Table e "Serviços Internos".
62-
63-
5. Conceitos de disparo de email.
61+
- Fabio: Estudar conceitos aplicados ate o momento para fixar aprendizagem
62+
- Fabio: implementar na coluna do ticker a data de agendamento
63+
- Fabio: Implementar disparo de email para cliente quando ticker for agendado
64+
- Fabio: Implementar Rotina para atualizar Start date quando agendamento for criado
6465

6566
# Comandos Utilizados
6667

@@ -79,3 +80,7 @@
7980
7. Rodar Seed: php arisan db:seed (caso tabelas ja existam) | php artisan migration --seed (Caso no momento da criação)
8081

8182
8. Linkar repositorio de arquivos: php artisan storage:link (So precisa fazer 1 vez)
83+
84+
9. Rodar Queue - php artisan queue:word
85+
86+
10. Ver rotas do sistema: - php artinsa route:list

app/Filament/Admin/Resources/TicketResource.php

+34-26
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,21 @@
22

33
namespace App\Filament\Admin\Resources;
44

5-
use Filament\Forms\Form;
6-
use Filament\Tables\Table;
5+
use App\Enums\Tickets\{AppoitmentTicketEnum, CategoryTicketEnum, PriorityTicketEnum, StatusTicketEnum};
6+
use App\Filament\Admin\Resources\TicketResource\RelationManagers\UseraddressesRelationManager;
7+
use App\Filament\Admin\Resources\TicketResource\{Pages};
78
use App\Models\Appointment;
8-
use Filament\{Forms, Tables};
99

1010
use App\Models\{Ticket, User};
11-
use Filament\Resources\Resource;
12-
use Illuminate\Support\Facades\Auth;
13-
use Filament\Notifications\Notification;
14-
use Illuminate\Database\Eloquent\{Builder};
15-
use App\Filament\Admin\Resources\TicketResource\{Pages};
11+
use Filament\Forms\Components\{DateTimePicker, Fieldset, FileUpload, Select};
12+
use Filament\Forms\Form;
1613
use Filament\Notifications\Actions\Action as NotificationAction;
17-
use Filament\Forms\Components\{DateTimePicker, Fieldset, FileUpload, Select, TextInput};
14+
use Filament\Notifications\Notification;
15+
use Filament\Resources\Resource;
1816
use Filament\Tables\Actions\{Action, ActionGroup, DeleteAction, EditAction, ViewAction};
19-
use App\Filament\Admin\Resources\TicketResource\RelationManagers\UseraddressesRelationManager;
20-
use App\Enums\Tickets\{AppoitmentTicketEnum, CategoryTicketEnum, PriorityTicketEnum, StatusTicketEnum};
17+
use Filament\Tables\Table;
18+
use Filament\{Forms, Tables};
19+
use Illuminate\Database\Eloquent\{Builder};
2120

2221
class TicketResource extends Resource
2322
{
@@ -171,18 +170,24 @@ public static function table(Table $table): Table
171170
])
172171
->actions([
173172
ActionGroup::make([
174-
ViewAction::make(),
175-
EditAction::make(),
173+
ViewAction::make()
174+
->color('secondary'),
175+
EditAction::make()
176+
->color('primary'),
176177
DeleteAction::make(),
178+
177179
Action::make('exibirmapa')
178180
->label('Exibir Mapa')
179-
->icon('fas-map-pin')
181+
//->icon('fas-map-pin')
182+
->icon('fas-map-location-dot')
183+
->color('warning')
180184
->url(function ($record) {
181185
// Obter o endereço do usuário associado ao registro
182-
$userAddress = $record->useraddresses;
186+
$userAddress = $record->userAddresses->first();
183187

184188
// Verificar se o endereço existe
185189
if ($userAddress) {
190+
186191
$street = urlencode($userAddress->street);
187192
$number = urlencode($userAddress->number);
188193
$city = urlencode($userAddress->city);
@@ -197,40 +202,43 @@ public static function table(Table $table): Table
197202

198203
Action::make('criaragendamento')
199204
->label('Criar Agendamento')
200-
->icon('fas-map-pin')
205+
->icon('fas-calendar-check')
206+
->color('info')
201207
->requiresConfirmation()
202208
->form([
203209
Select::make('type_service')
204210
->options(
205-
AppoitmentTicketEnum::class
211+
AppoitmentTicketEnum::class
206212
),
207213
DateTimePicker::make('date'),
208214
])
209215
->slideOver()
210216
->action(function (Ticket $record, array $data) {
211-
$users= $record->user_id;
212-
Appointment::create([
213-
'ticket_id' => $record->id,
217+
$users = $record->user_id;
218+
Appointment::create([
219+
'ticket_id' => $record->id,
214220
'type_service' => $data['type_service'],
215-
'date' => $data['date'],
221+
'date' => $data['date'],
216222
]);
217223

218-
Notification::make()
224+
Notification::make()
219225
->title('Chamado agendado com sucesso')
220226
->body("Seu Chamado de N. {$record->id} Agendado para " . \Carbon\Carbon::parse($data['date'])->format('d/m/Y H:i:s') . " de forma " . AppoitmentTicketEnum::from($data['type_service'])->getLabel())
221227

222228
->success()
223229
->actions([
224-
NotificationAction::make('Visualizar')
225-
->url(route('filament.app.resources.tickets.view', ['record' => $record->id])),
230+
NotificationAction::make('Visualizar')
231+
->url(route('filament.app.resources.tickets.view', ['record' => $record->id])),
226232

227-
])
233+
])
228234

229235
->sendToDatabase(User::find($users));
230236

231237
}),
232238

233-
]),
239+
])
240+
->icon('fas-sliders')
241+
->color('warning'),
234242

235243
])
236244
->bulkActions([

app/Filament/Admin/Resources/TicketResource/RelationManagers/UseraddressesRelationManager.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
class UseraddressesRelationManager extends RelationManager
1414
{
15-
protected static string $relationship = 'useraddresses';
15+
protected static string $relationship = 'userAddresses'; // Relacionamento indireto (via User)
1616

1717
public function form(Form $form): Form
1818
{

app/Filament/App/Resources/TicketResource.php

-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ public static function form(Form $form): Form
5858
->uploadingMessage('Uploading attachment...')
5959
->maxParallelUploads(1),
6060
])->columns(1),
61-
6261
]);
6362
}
6463

app/Models/Ticket.php

+34-8
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
use App\Enums\Tickets\{CategoryTicketEnum, PriorityTicketEnum, StatusTicketEnum};
66
use Illuminate\Contracts\Database\Eloquent\Builder;
77
use Illuminate\Database\Eloquent\Model;
8-
use Illuminate\Database\Eloquent\Relations\{BelongsTo, HasMany, HasOne};
8+
use Illuminate\Database\Eloquent\Relations\{BelongsTo, HasMany, HasManyThrough, HasOne};
99
use Illuminate\Support\Facades\Auth;
1010

1111
class Ticket extends Model
@@ -57,18 +57,44 @@ public function ticketresponses(): HasMany
5757
{
5858
return $this->hasMany(TicketResponse::class, 'ticket_id');
5959
}
60-
6160
public function review(): HasOne
6261
{
6362
return $this->hasOne(Review::class);
6463
}
65-
public function useraddresses(): HasOne
64+
65+
/*
66+
67+
Explicação detalhada comparando os dois métodos de relacionamento e o que foi feito:
68+
69+
1. Relacionamento Original: useraddresses
70+
71+
public function useraddresses(): HasMany
6672
{
67-
return $this->hasOne(UserAddress::class, 'user_id');
73+
return $this->hasMany(UserAddress::class, 'user_id');
74+
}
75+
76+
O relacionamento anterior relacionamento está incorreto, porque o campo user_id na tabela user_addresses não está diretamente relacionado
77+
à tabela tickets, mas sim à tabela users. Como resultado,
78+
não é possível acessar corretamente os endereços de um usuário a partir de um ticket,
79+
já que o modelo Ticket não tem uma relação direta com UserAddress.
80+
81+
COrreção: Esse método define um relacionamento HasManyThrough entre o modelo Ticket e o modelo UserAddress,
82+
passando pelo modelo intermediário User. Ele informa ao Laravel que para encontrar os endereços (UserAddress)
83+
de um ticke
84+
85+
O ajuste do relacionamento para hasManyThrough corrige o problema de tentar acessar endereços diretamente de Ticket,
86+
indicando que o caminho correto passa pelo modelo User. Essa mudança respeita a estrutura do banco de dados e
87+
permite que o Laravel recupere os dados de forma adequada.
88+
89+
*/
90+
public function userAddresses(): HasManyThrough
91+
{
92+
return $this->hasManyThrough(UserAddress::class, User::class, 'id', 'user_id', 'user_id', 'id');
93+
}
94+
public function appoitments(): HasOne
95+
{
96+
return $this->hasOne(Appointment::class);
97+
6898
}
69-
public function appoitments(): HasOne
70-
{
71-
return $this->hasOne(Appointment::class);
7299

73-
}
74100
}

app/Models/User.php

+3-3
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
use Filament\Models\Contracts\HasAvatar;
66
use Illuminate\Contracts\Auth\MustVerifyEmail;
77
use Illuminate\Database\Eloquent\Factories\HasFactory;
8-
use Illuminate\Database\Eloquent\Relations\{HasMany, HasOne};
8+
use Illuminate\Database\Eloquent\Relations\{HasMany};
99
use Illuminate\Foundation\Auth\User as Authenticatable;
1010
use Illuminate\Notifications\Notifiable;
1111
use Illuminate\Support\Facades\{Storage};
@@ -76,8 +76,8 @@ public function reviews(): HasMany
7676
return $this->hasMany(Review::class);
7777
}
7878

79-
public function useraddresses(): HasOne
79+
public function userAddresses(): HasMany
8080
{
81-
return $this->hasOne(UserAddress::class);
81+
return $this->hasMany(UserAddress::class, 'user_id');
8282
}
8383
}

0 commit comments

Comments
 (0)