Update of login system based on front-end checks, token system and change in database structure, so that the company is not a User but an entity to associate several users +

This commit is contained in:
ygbanzato 2024-04-08 16:15:48 +01:00
parent 0ac269c5d7
commit cd02d1c258
25 changed files with 1357 additions and 207 deletions

View File

@ -3,6 +3,7 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Models\AmbitsEquipment; use App\Models\AmbitsEquipment;
use App\Models\AssociationCompanyUser;
use App\Models\Equipment; use App\Models\Equipment;
use App\Models\EquipmentAssociationAmbit; use App\Models\EquipmentAssociationAmbit;
use App\Models\EquipmentWorkHistory; use App\Models\EquipmentWorkHistory;
@ -396,8 +397,12 @@ public function getDataProjects(Request $request)
public function receiveProjectsClient() public function receiveProjectsClient()
{ {
$client = Auth::user()->user_id; $client = Auth::user()->user_id;
// DD($client);
$recebeCompanyID = AssociationCompanyUser::where('user_id',$client)->first();
$recevePlantClient = Plant::where('user_id', $client)->get();
$recevePlantClient = Plant::where('company_id', $recebeCompanyID->company_id)->get();
// Extrai os plant_id da coleção $recevePlantClient // Extrai os plant_id da coleção $recevePlantClient
$plantsIds = $recevePlantClient->pluck('plant_id'); $plantsIds = $recevePlantClient->pluck('plant_id');

View File

@ -2,6 +2,8 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Models\AssociationCompanyUser;
use App\Models\Company;
use App\Models\EquipmentWorkHistory; use App\Models\EquipmentWorkHistory;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
@ -150,7 +152,7 @@ public function deletePendingEquipments(Request $request)
$pendingEquipmentIds = $request->input('pendingEquipmentIds', []); $pendingEquipmentIds = $request->input('pendingEquipmentIds', []);
// Verifica se o array não está vazio // Verifica se o array não está vazio
if (!empty ($pendingEquipmentIds)) { if (!empty($pendingEquipmentIds)) {
// Deleta todos os registros de PendingEquipment que correspondam aos IDs // Deleta todos os registros de PendingEquipment que correspondam aos IDs
PendingEquipment::whereIn('pending_equipment_id', $pendingEquipmentIds)->delete(); PendingEquipment::whereIn('pending_equipment_id', $pendingEquipmentIds)->delete();
} }
@ -187,7 +189,7 @@ public function deleteFurtherTasks(Request $request)
//Se o utilizador click mas nao associar as tarefas. //Se o utilizador click mas nao associar as tarefas.
$selectedTasks = $request->input('selectedTasks', []); $selectedTasks = $request->input('selectedTasks', []);
if (empty ($selectedTasks)) { if (empty($selectedTasks)) {
return back()->with('danger', 'Não existem tarefas complementares selecionadas para exclusão.'); return back()->with('danger', 'Não existem tarefas complementares selecionadas para exclusão.');
} }
@ -471,9 +473,9 @@ public function finishCreatingProject($numberProject)
$taskId = $furtherTask->elemental_tasks_id; $taskId = $furtherTask->elemental_tasks_id;
// Verificar se a tarefa está associada a algum id_workstations // Verificar se a tarefa está associada a algum id_workstations
$checkExistFurtherTaskInWs = WorkstationsAssociationTasks::whereIn('id_workstations',$workstationIds) $checkExistFurtherTaskInWs = WorkstationsAssociationTasks::whereIn('id_workstations', $workstationIds)
->where('elemental_tasks_id',$taskId) ->where('elemental_tasks_id', $taskId)
->exists(); ->exists();
// Se não existe, adicionar à lista de tarefas faltantes // Se não existe, adicionar à lista de tarefas faltantes
if (!$checkExistFurtherTaskInWs) { if (!$checkExistFurtherTaskInWs) {
@ -493,7 +495,7 @@ public function finishCreatingProject($numberProject)
'workstation' => $missingWorkstations 'workstation' => $missingWorkstations
]; ];
// Verificar se todos os arrays internos estão vazios // Verificar se todos os arrays internos estão vazios
$isEmpty = empty ($allMissingTasks['elemental']) && empty ($allMissingTasks['further']) && empty ($allMissingTasks['workstation']); $isEmpty = empty($allMissingTasks['elemental']) && empty($allMissingTasks['further']) && empty($allMissingTasks['workstation']);
if (!$isEmpty) { if (!$isEmpty) {
return redirect()->back()->with('errors', $allMissingTasks); return redirect()->back()->with('errors', $allMissingTasks);
@ -699,11 +701,11 @@ public function createWorkStations(Request $request)
->with('listWorkstations', $listWorkstations); ->with('listWorkstations', $listWorkstations);
} }
// Funcao apenas para retornar os dados necessarios para a view criar uma Obra. // Funcao apenas para retornar os dados necessarios para a view criar uma Obra.
public function createProjectForStep1() public function createProjectForStep1()
{ {
$companies = User::where('type_users', 3)->get(); // $companies = User::where('type_users', 3)->get();
$companies = Company::all();
// Apos terminar não vai ficar step 1 // Apos terminar não vai ficar step 1
return view('projectsClients/createProject', ['step' => 1], ['companies' => $companies]); return view('projectsClients/createProject', ['step' => 1], ['companies' => $companies]);
} }
@ -857,7 +859,7 @@ public function processStep1(Request $request)
$newInstallation->plant_name = $request->input('new_company_name'); $newInstallation->plant_name = $request->input('new_company_name');
$newInstallation->plant_address = $request->input('new_company_address'); $newInstallation->plant_address = $request->input('new_company_address');
$newInstallation->user_id = $request->input('user_id'); $newInstallation->company_id = $request->input('company_select');
$newInstallation->save(); $newInstallation->save();
@ -891,7 +893,7 @@ public function processStep1(Request $request)
$project->save(); $project->save();
return redirect()->route('articulated_2', ['id' => $project->company_projects_id]) return redirect()->route('articulated_2', ['projectID' => $project->company_projects_id])
->with('success', 'Project criado com sucesso!'); ->with('success', 'Project criado com sucesso!');
} }
@ -990,7 +992,7 @@ public function createEquipmentManual(Request $request)
]); ]);
if ($existingEquipment) { if ($existingEquipment) {
return redirect()->route('articulated_2', ['id' => $request->numberProject]) return redirect()->route('articulated_2', ['projectID' => $request->numberProject])
->with('danger', 'Equipamento ja Existe !!') ->with('danger', 'Equipamento ja Existe !!')
->with('listEquipmentsProjects', $listEquipmentsProjects); ->with('listEquipmentsProjects', $listEquipmentsProjects);
} }
@ -1103,7 +1105,7 @@ public function createEquipmentManual(Request $request)
} }
// O $request->numberProject e sempre necessario retornar para indicar a obra que se esta modificando... // O $request->numberProject e sempre necessario retornar para indicar a obra que se esta modificando...
return redirect()->route('articulated_2', ['id' => $request->numberProject]) return redirect()->route('articulated_2', ['projectID' => $request->numberProject])
->with('success', 'Equipamento criado com sucesso') ->with('success', 'Equipamento criado com sucesso')
->with('listEquipmentsProjects', $listEquipmentsProjects); ->with('listEquipmentsProjects', $listEquipmentsProjects);
} }
@ -1153,7 +1155,7 @@ public function processStep2(Request $request)
$dataLines = $data[$i]; $dataLines = $data[$i];
// Verifica se a coluna 'fábrica' (primeiro campo) está vazia // Verifica se a coluna 'fábrica' (primeiro campo) está vazia
if (empty ($dataLines[0])) { if (empty($dataLines[0])) {
// Se a coluna 'fábrica' estiver vazia, pule para a próxima linha // Se a coluna 'fábrica' estiver vazia, pule para a próxima linha
continue; continue;
} }
@ -1161,7 +1163,7 @@ public function processStep2(Request $request)
// Verifica se os 5 primeiros campos essenciais estão preenchidos // Verifica se os 5 primeiros campos essenciais estão preenchidos
for ($j = 0; $j < 5; $j++) { for ($j = 0; $j < 5; $j++) {
if (empty ($dataLines[$j])) { if (empty($dataLines[$j])) {
// Adiciona o índice do campo vazio ao array $camposVazios // Adiciona o índice do campo vazio ao array $camposVazios
$emptyFields[] = $columnRealNames[$j]; // ou simplesmente $j se não tiver o nome da coluna $emptyFields[] = $columnRealNames[$j]; // ou simplesmente $j se não tiver o nome da coluna
} }
@ -1292,7 +1294,7 @@ public function processStep2(Request $request)
} elseif ($chooseAction == 'createEquipments') { } elseif ($chooseAction == 'createEquipments') {
if (!empty ($emptyFields)) { if (!empty($emptyFields)) {
// Se houver campos vazios, adicione a linha e os campos vazios às linhas ignoradas // Se houver campos vazios, adicione a linha e os campos vazios às linhas ignoradas
$ignoredLines[] = [ $ignoredLines[] = [
'line' => $i + 1, 'line' => $i + 1,
@ -1433,7 +1435,7 @@ public function processStep2(Request $request)
} }
} }
if ($countPendingEquipments != 0 && !empty ($equipmentPendingLogs)) { if ($countPendingEquipments != 0 && !empty($equipmentPendingLogs)) {
// Se houver equipamentos pendentes, redirecione com essa informação e inclua os $linhasIgnoradas se não estiverem vazios // Se houver equipamentos pendentes, redirecione com essa informação e inclua os $linhasIgnoradas se não estiverem vazios
return redirect()->route('articulated_2', ['id' => $request->numberProject]) return redirect()->route('articulated_2', ['id' => $request->numberProject])
->with('danger', 'Equipamentos Pendentes criados: ' . $countPendingEquipments) ->with('danger', 'Equipamentos Pendentes criados: ' . $countPendingEquipments)
@ -1538,7 +1540,7 @@ public function workstationsAssociationTasks(Request $request)
foreach ($taskTypes as $groupTasks) { foreach ($taskTypes as $groupTasks) {
if (isset ($request[$groupTasks])) { // Checar se esse grupo de tarefas existe no request if (isset($request[$groupTasks])) { // Checar se esse grupo de tarefas existe no request
foreach ($request[$groupTasks] as $taskID => $check) { foreach ($request[$groupTasks] as $taskID => $check) {
//Este code pode parecer repetitivo, pois antes tinha uma tabela para os 2 tipos de tarefa. TE e TC apos atualizacao ambas ficam em uma so tabela, porem por falta de tempo ainda nao foi melhorado sua logina , MAS FUNCIONA !!!! //Este code pode parecer repetitivo, pois antes tinha uma tabela para os 2 tipos de tarefa. TE e TC apos atualizacao ambas ficam em uma so tabela, porem por falta de tempo ainda nao foi melhorado sua logina , MAS FUNCIONA !!!!
@ -1607,7 +1609,7 @@ public function index()
$groupedEquipments = []; $groupedEquipments = [];
foreach ($results as $result) { foreach ($results as $result) {
if (!isset ($groupedEquipments[$result->tag])) { if (!isset($groupedEquipments[$result->tag])) {
$groupedEquipments[$result->tag] = []; $groupedEquipments[$result->tag] = [];
} }
@ -1620,7 +1622,7 @@ public function index()
$equipments = DB::table('equipments')->get(); $equipments = DB::table('equipments')->get();
foreach ($equipments as $equipment) { foreach ($equipments as $equipment) {
if (isset ($groupedEquipments[$equipment->tag])) { if (isset($groupedEquipments[$equipment->tag])) {
$equipment->specific_attributes = $groupedEquipments[$equipment->tag]; $equipment->specific_attributes = $groupedEquipments[$equipment->tag];
} }
} }
@ -1691,15 +1693,32 @@ public function storeProject(Request $request)
// Agora, você pode usar $company_id ao criar o projeto // Agora, você pode usar $company_id ao criar o projeto
} }
// public function getByUserNif(Request $request)
// {
// $user_id = $request->input('user_id'); //Check
// $installations = Plant::where('user_id', $user_id)->get();
// $associationUserCompany = AssociationCompanyUser::where('association_company_user_id',$user_id)->get();
// return response()->json($installations);
// }
public function getByUserNif(Request $request) public function getByUserNif(Request $request)
{ {
$companyId = $request->input('company_id'); // Considerando que este ID é na verdade o ID da empresa
// dd(Plant::where('user_id', $request->input('user_id'))->get()); // Busca as instalações associadas à empresa
// $installations = Plant::where('company_id', $companyId)->get();
$user_id = $request->input('user_id'); //Check // Busca os usuários associados à empresa
$installations = Plant::where('user_id', $user_id)->get(); $userIds = AssociationCompanyUser::where('company_id', $companyId)->pluck('user_id');
$users = User::whereIn('user_id', $userIds)->get();
return response()->json($installations); return response()->json([
// 'installations' => $installations,
'users' => $users
]);
} }
public function getAmbits($equipmentType) public function getAmbits($equipmentType)

View File

@ -2,6 +2,7 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Models\AssociationCompanyUser;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use App\Actions\Fortify\CreateNewUser; use App\Actions\Fortify\CreateNewUser;
@ -25,8 +26,10 @@ class CustomRegistrationController extends Controller
{ {
public function store(Request $request): RedirectResponse public function store(Request $request): RedirectResponse
{ {
// dd($request);
$user = app(CreateNewUser::class)->create($request->all()); $user = app(CreateNewUser::class)->create($request->all());
$pendingUser = PendingUser::where('pending_user_email', $user->email)->first(); $pendingUser = PendingUser::where('pending_user_email', $user->email)->first();
if ($pendingUser) { if ($pendingUser) {
$pendingUser->delete(); $pendingUser->delete();
@ -36,9 +39,16 @@ public function store(Request $request): RedirectResponse
$user->sendEmailVerificationNotification(); $user->sendEmailVerificationNotification();
} }
if($request->type_users == 3 && $request->company){
$associationUserCompany = new AssociationCompanyUser;
$associationUserCompany->company_id = $request->company;
$associationUserCompany->user_id = $user->user_id;
$associationUserCompany->save();
}
return $request->wantsJson() return $request->wantsJson()
? new JsonResponse([], 201) ? new JsonResponse([], 201)
: Redirect::to('/CreateUsers')->with('success', 'Utilizador criado com sucesso, aguarda confirmacao por Email!!'); : Redirect::to('/CreateUsers')->with('status', 'Utilizador criado com sucesso !');
} }

View File

@ -2,21 +2,62 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Models\FormAccessToken;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Str;
use Carbon\Carbon;
use Illuminate\Support\Facades\Mail; use Illuminate\Support\Facades\Mail;
class FormController extends Controller class FormController extends Controller
{ {
public function createUserForm(Request $request)
{
$token = $request->query('token');
$tokenRecord = FormAccessToken::where('token', $token)->first();
if (!$tokenRecord || $tokenRecord->expires_at <= now()) {
if ($tokenRecord) {
$email = $tokenRecord->email;
$tokenRecord->delete(); // Apaga o registro do token expirado
// Reenviar o email
$this->gerarEnviarEmail($email);
return redirect('/login')->with('success', 'O token anterior expirou, consequentemente,um novo link foi remetido para o seu email.');
} else {
return redirect('/login')->with('danger', 'O token é inválido.');
}
} else {
// Token é válido e ainda não expirou
return view('email/FormAdmin', compact('tokenRecord'));
}
}
public function enviarEmail(Request $request) public function enviarEmail(Request $request)
{ {
$email = $request->input('email'); $email = $request->input('email');
$this->gerarEnviarEmail($email);
Mail::send('email.email', [], function ($message) use ($email) {
$message->to($email);
$message->subject('Formulário "Ispt4.0"');
});
return back()->with('status', 'Email enviado com sucesso!'); return back()->with('status', 'Email enviado com sucesso!');
} }
protected function gerarEnviarEmail($email)
{
// Gerar um token único
$token = Str::random(60);
// Definir o tempo de expiração do token (ex: 1 hora a partir de agora)
$expiresAt = Carbon::now()->addHour();
// Criar registro na tabela form_access_tokens
FormAccessToken::create([
'token' => $token,
'email' => $email,
'expires_at' => $expiresAt,
]);
// Enviar email
Mail::send('email.email', ['token' => $token], function ($message) use ($email) {
$message->to($email);
$message->subject('Formulário "Ispt4.0"');
});
}
} }

View File

@ -2,6 +2,9 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Models\Company;
use App\Models\CompanyProject;
use App\Models\FormAccessToken;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator; use Illuminate\Support\Facades\Validator;
@ -17,6 +20,74 @@
class Pending_UserController extends Controller class Pending_UserController extends Controller
{ {
public function validateForm(Request $request)
{
$value = $request->get('value');
$type = $request->get('type');
// Inicializa os resultados como null para indicar que não foram verificados
$resultEmail = null;
$resultNif = null;
$resultPhone = null;
if ($type === 'email') {
$columnEmail = ['pending_user_email', 'email'];
$existsInPendingUser = PendingUser::where($columnEmail[0], $value)->exists();
$existsInUser = User::where($columnEmail[1], $value)->exists();
if ($existsInPendingUser && $existsInUser) {
$resultEmail = 3;
} elseif ($existsInPendingUser) {
$resultEmail = 2;
} elseif ($existsInUser) {
$resultEmail = 1;
} else {
$resultEmail = 0;
}
} elseif ($type === 'nif') {
$columnNif = ['pending_user_nif', 'user_nif'];
$existsInPendingUser = PendingUser::where($columnNif[0], $value)->exists();
$existsInUser = User::where($columnNif[1], $value)->exists();
if ($existsInPendingUser && $existsInUser) {
$resultNif = 3;
} elseif ($existsInPendingUser) {
$resultNif = 2;
} elseif ($existsInUser) {
$resultNif = 1;
} else {
$resultNif = 0;
}
} elseif ($type === 'phone') {
$resultPhone = ['pending_user_phone', 'user_phone'];
$existsInPendingUser = PendingUser::where($resultPhone[0], $value)->exists();
$existsInUser = User::where($resultPhone[1], $value)->exists();
if ($existsInPendingUser && $existsInUser) {
$resultPhone = 3;
} elseif ($existsInPendingUser) {
$resultPhone = 2;
} elseif ($existsInUser) {
$resultPhone = 1;
} else {
$resultPhone = 0;
}
}
return response()->json([
'result_email' => $resultEmail,
'result_nif' => $resultNif,
'result_phone' => $resultPhone
]);
}
public function ListPendingUsers() public function ListPendingUsers()
{ {
$pend_users = PendingUser::all(); $pend_users = PendingUser::all();
@ -27,13 +98,15 @@ public function ShowFormUser($id)
{ {
$pend_user = PendingUser::findOrFail($id); $pend_user = PendingUser::findOrFail($id);
$types = TypeUser::all(); $types = TypeUser::all();
return view('Admin.CrudUsers.createUser', compact('pend_user', 'types')); $allCompanies = Company::all();
return view('Admin.CrudUsers.createUser', compact('pend_user', 'types','allCompanies'));
} }
public function store(Request $request) public function store(Request $request)
{ {
// dd($request);
$request->validate([ $request->validate([
'name' => 'required', 'name' => 'required',
'lastName' => 'required', 'lastName' => 'required',
@ -43,21 +116,6 @@ public function store(Request $request)
'pending_password' => 'required|min:8|confirmed', 'pending_password' => 'required|min:8|confirmed',
]); ]);
// $validator = Validator::make($request->all(), [
// 'name' => 'required',
// 'lastName' => 'required',
// 'pending_email' => 'required',
// 'pending_phone' => 'required',
// 'pending_nif' => 'required',
// 'pending_password' => 'required',
// 'pending_password_confirmation' => 'required'
// ]);
// dd($validator);
// if ($validator->fails()) {
// return redirect()->back()->withErrors($validator)->withInput();
// }
$joinName = $request->get('name') . ' ' . $request->get('lastName'); $joinName = $request->get('name') . ' ' . $request->get('lastName');
$pendingUser = new PendingUser(); $pendingUser = new PendingUser();
@ -69,6 +127,13 @@ public function store(Request $request)
$pendingUser->save(); $pendingUser->save();
//Recebe o token criado para preencher o formulario e apaga o mesmo apos criar o User.
$receiveToken = FormAccessToken::where('token',$request->get('receiveToken'))->first();
if($receiveToken){
$receiveToken->delete();
}
// Enviar email de notificação para todos os Super_Administrador // Enviar email de notificação para todos os Super_Administrador
$superAdmins = User::where('type_users', 'Super_Administrador')->get(); $superAdmins = User::where('type_users', 'Super_Administrador')->get();
$newUserNotification = new NewUserNotification(); $newUserNotification = new NewUserNotification();
@ -77,7 +142,7 @@ public function store(Request $request)
Mail::to($superAdmin->email)->send($newUserNotification); Mail::to($superAdmin->email)->send($newUserNotification);
} }
return redirect('/formulario')->with('success', 'O seu registo foi submetido e encontra-se pendente de aprovação. Pode encerrar a página. '); return redirect('login')->with('success', '"O seu registo foi submetido e está atualmente pendente de aprovação. Por favor, aguarde antes de iniciar sessão no sistema." ');
} }

View File

@ -2,6 +2,8 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Models\AssociationCompanyUser;
use App\Models\Company;
use App\Models\TypeUser; use App\Models\TypeUser;
use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
@ -20,9 +22,11 @@
use Illuminate\Auth\Events\Verified; use Illuminate\Auth\Events\Verified;
use App\Models\User; use App\Models\User;
use App\Models\FormAccessToken;
class userController extends Controller class userController extends Controller
{ {
public function EditProfile(Request $request) public function EditProfile(Request $request)
{ {
// Verifica se um arquivo foi enviado e se o tamanho é maior que 70 KB // Verifica se um arquivo foi enviado e se o tamanho é maior que 70 KB
@ -77,7 +81,6 @@ public function EditProfile(Request $request)
return back()->with('success', "Perfil actualizado com sucesso!"); return back()->with('success', "Perfil actualizado com sucesso!");
} }
public function UserProfile($id) public function UserProfile($id)
{ {
$user = User::find($id); $user = User::find($id);
@ -131,12 +134,6 @@ public static function authenticateAndRedirect(Request $request)
} }
public function listCompanies()
{
$users = User::with('userType')->where('type_users', '=', 3)->get();
return view('Admin.CrudUsers.listCompany', compact('users'));
}
//Busca Todos os Utilizador Exeto as 'Empresas' //Busca Todos os Utilizador Exeto as 'Empresas'
public function listUsers() public function listUsers()
@ -168,7 +165,7 @@ public function edit($id)
public function update(Request $request, User $user) public function update(Request $request, User $user)
{ {
//Por enquanto foi retirado o 'user_type' pois ainda não é necessario alterar o tipo de utilizador na edição. //Por enquanto foi retirado o 'user_type' pois ainda não é necessario alterar o tipo de utilizador na edição.
$request->validate([ $request->validate([
'name' => 'required', 'name' => 'required',
@ -190,10 +187,10 @@ public function update(Request $request, User $user)
$user->save(); $user->save();
if($user->type_users == 3){ if ($user->type_users == 3) {
return redirect('/users/listCompanies')->with('success', 'Utilizador atualizado com Sucesso!!'); return redirect('/users/listCompanies')->with('success', 'Utilizador atualizado com Sucesso!!');
}else } else
return redirect('/users/listUsers')->with('success', 'Utilizador atualizado com Sucesso!!'); return redirect('/users/listUsers')->with('success', 'Utilizador atualizado com Sucesso!!');
} }
@ -230,11 +227,51 @@ public function destroy(User $user)
{ {
$user->delete(); $user->delete();
if($user->type_users == 3){ if ($user->type_users == 3) {
return redirect('/users/listCompanies')->with('success', 'Empresa deletado com sucesso!'); return redirect('/users/listCompanies')->with('success', 'Empresa deletado com sucesso!');
}else { } else {
return redirect('/users/listUsers')->with('success', 'Utilizador deletado com sucesso!'); return redirect('/users/listUsers')->with('success', 'Utilizador deletado com sucesso!');
} }
} }
public function listCompanies()
{
// $users = User::with('userType')->where('type_users', '=', 3)->get();
$companiesList = Company::all();
// $companierList = AssociationCompanyUser
return view('Admin.CrudUsers.listCompany', compact('companiesList'));
}
public function showCompany($id)
{
$company = Company::where('company_id', $id)->first();
// Busca todos os registros na tabela association_company_user que correspondem à company_id
$associationRecords = AssociationCompanyUser::where('company_id', $id)->get();
// Extrai todos os user_id da coleção de registros
$userIds = $associationRecords->pluck('user_id');
// Busca os detalhes dos usuários na tabela users usando os IDs coletados
$companyUsers = User::whereIn('user_id', $userIds)->get();
return view('Admin.CrudCompanies.showCompanyDetails', compact('company','companyUsers'));
}
public function createCompany(Request $request)
{
$createCompany = new Company;
$createCompany->company_name = $request->company_name;
$createCompany->save();
return redirect('CreateUsers')->with('status', 'A Empresa ' . $createCompany->company_name . ' foi criada com êxito. Consulte na página "Empresas".');
}
} }

View File

@ -71,8 +71,11 @@ protected function getAllowedRoutesForUserType($userType)
'users.company','users.Show','users.edit','users.destroy','users.update','users.list', 'users.company','users.Show','users.edit','users.destroy','users.update','users.list',
'CreateUsers', 'CreateUsers',
'enviar.formulario', 'enviar.formulario',
'projectDetails_1','workStation_3','addFurtherTasks','deleteFurtherTasks','editEquipmentTasks' 'projectDetails_1','workStation_3','addFurtherTasks','deleteFurtherTasks','editEquipmentTasks',
'usersProfiles','showCompany',
'articulated_2CreateEquipment','processStep2','deleteEquipmentInProject','changeAmbitEquipment',
'deletePendingEquipments','CreateNewEquipmentFromPendingEquipment','removeEquipment','receiveEquipmentToAssociateTasks',
''
]; ];

View File

@ -0,0 +1,16 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class AssociationCompanyUser extends Model
{
use HasFactory;
protected $table = 'association_company_user';
public $timestamps = false;
}

22
app/Models/Company.php Normal file
View File

@ -0,0 +1,22 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Company extends Model
{
use HasFactory;
public $timestamps = false;
protected $primaryKey = 'company_id';
public function users()
{
return $this->belongsToMany(User::class, 'association_company_user', 'company_id', 'user_id');
}
}

View File

@ -0,0 +1,36 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class FormAccessToken extends Model
{
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'form_access_tokens';
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'token',
'email',
'expires_at',
];
/**
* The attributes that should be cast.
*
* @var array
*/
protected $casts = [
'expires_at' => 'datetime',
];
}

View File

@ -15,9 +15,9 @@ class Plant extends Model
public $timestamps = false; public $timestamps = false;
public function user(){ // public function user(){
return $this->belongsTo(User::class, 'user_id', 'user_id'); // return $this->belongsTo(User::class, 'user_id', 'user_id');
} // }
public function companyProjects(){ public function companyProjects(){
return $this->hasMany(CompanyProject::class, 'plant_id', 'plant_id'); return $this->hasMany(CompanyProject::class, 'plant_id', 'plant_id');

View File

@ -61,4 +61,8 @@ public function plants(){
return $this->hasMany(Plant::class,'user_id', 'user_id'); return $this->hasMany(Plant::class,'user_id', 'user_id');
} }
public function companies()
{
return $this->belongsToMany(Company::class, 'association_company_user', 'user_id', 'company_id');
}
} }

View File

@ -1,4 +1,4 @@
/* International Telephone Input Css */ /* International Telephone Input Css
.flag-container { .flag-container {
position: absolute; position: absolute;
top: 0; top: 0;
@ -20,8 +20,42 @@ .selected-flag {
align-items: center; align-items: center;
height: 100%; height: 100%;
padding: 0 6px 0 8px; padding: 0 6px 0 8px;
} */
/* Estilização para o input de telefone */
input#pending_phone {
padding-left: 50px;
/* Ajuste este valor baseando-se na largura do seu seletor de bandeiras */
position: relative;
} }
/* International Telephone Input Css */
.flag-container {
position: absolute;
top: 0;
bottom: 0;
left: 0;
padding: 1px;
z-index: 2;
/* Garante que o seletor de bandeiras fique acima do input */
}
.flag-container:hover {
cursor: pointer;
}
.selected-flag {
z-index: 3;
/* Mais especificidade para garantir que fique acima do input */
position: absolute;
/* Posicionamento absoluto dentro do input */
display: flex;
align-items: center;
height: 100%;
padding: 0 6px 0 8px;
}
.flag.bd { .flag.bd {
height: 12px; height: 12px;
background-position: -418px 0; background-position: -418px 0;
@ -138,7 +172,8 @@ .flag.va {
width: 15px; width: 15px;
} }
@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { @media (-webkit-min-device-pixel-ratio: 2),
(min-resolution: 192dpi) {
.flag { .flag {
background-size: 5652px 15px; background-size: 5652px 15px;
} }
@ -1444,7 +1479,8 @@ .flag {
background-position: 20px 0; background-position: 20px 0;
} }
@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { @media (-webkit-min-device-pixel-ratio: 2),
(min-resolution: 192dpi) {
.flag { .flag {
background-image: url("../../../img/flagsImg/flags.png"); background-image: url("../../../img/flagsImg/flags.png");
} }

View File

@ -54,7 +54,7 @@
'users_listUsers' => [ 'users_listUsers' => [
//Navbar //Navbar
'users' => 'Utilizadores', 'users' => 'Utilizadores',
'companies' => 'Clientes', 'companies' => 'Empresas',
'create_users' => 'Criar Utilizadores', 'create_users' => 'Criar Utilizadores',
'top_view_part' => [ 'top_view_part' => [

View File

@ -0,0 +1,130 @@
@extends('Templates/templateAdmin')
@section('Main-content')
<section class="content-header">
<div class="container-fluid">
<div class="row mb-2">
<div class="col-sm-6">
<h1>{{ $company->company_name }}</h1>
</div>
<div class="col-sm-6">
<ol class="breadcrumb float-sm-right">
<li class="breadcrumb-item active">{{ __('messages.users_listUsers.top_view_part.administration') }}
</li>
{{-- Criar uma rota para Lista de Empresas --}}
<li class="breadcrumb-item active">Lista de Empresas</li>
<li class="breadcrumb-item active">{{ $company->company_name }}</li>
</ol>
</div>
</div>
</div>
</section>
<section class="content">
<div class="container-fluid">
<div class="card card-primary mb">
<div class="card-header">
<h3 class="card-title mb-0">Detalhes da Empresa </h3>
</div>
<div class="card-body">
<div class="card card-success mb">
<div class="card-header">
<h3 class="card-title mb-0">Utilizadores associados a Empresa </h3>
</div>
<div class="card-body">
<table class="table table-hover text-nowrap mt-2" id="tableReceiveCompanies">
<thead>
<tr>
<th>Nome</th>
<th>Email</th>
<th>Ações</th>
</tr>
</thead>
<tbody>
@foreach ($companyUsers as $user)
<tr>
<td>{{ $user->user_name }}</td>
<td>{{ $user->email }}</td>
<td class="table-btn-group-al">
<div class="d-flex justify-content-center dropdown">
<button data-toggle="dropdown" aria-expanded="false"
class="actions-btn btn btn-light circle ">
<i class="fa fa-ellipsis-v"></i>
</button>
<div id="group-actions-btn-14"
class="dropdown-menu dropdown-menu-light">
<a href="{{ route('users.Show', ['id' => $user->user_id]) }}"
class="dropdown-item text-primary">
<i class="fa-solid fa-eye text-primary"></i>
Detalhes
</a>
</div>
</div>
</td>
</tr>
@endforeach
{{-- @foreach ($companiesList as $company)
<tr>
<td>{{ $company->company_name }}</td>
<td class="table-btn-group-al">
<div class="d-flex justify-content-center dropdown">
<button data-toggle="dropdown" aria-expanded="false"
class="actions-btn btn btn-light circle ">
<i class="fa fa-ellipsis-v"></i>
</button>
<div id="group-actions-btn-14" class="dropdown-menu dropdown-menu-light">
<a href="{{ route('showCompany', ['id' => $company->id_company]) }}"
class="dropdown-item text-primary">
<i class="fa-solid fa-eye text-primary"></i>
Detalhes
</a>
<a href="{{ route('users.edit', ['id' => $user->user_id]) }}"
class="dropdown-item text-primary">
<i class="fa-solid fa-edit text-primary"></i>
Editar
</a>
<form action="{{ route('users.destroy', $user) }}" method="POST"
onsubmit="return confirm('Are you sure you want to delete this user?');"
style="display:inline;">
@csrf
@method('DELETE')
<button type="submit" class="dropdown-item text-danger">
<i class="fa-solid fa-trash-alt text-danger"></i>
Excluir
</button>
</form>
</div>
</div>
</td>
</tr>
@endforeach --}}
</tbody>
</table>
</div>
</div>
</div>
{{-- /.card-body --}}
</div>
</div>
</section>
@endsection
@section('scriptsTemplateAdmin')
<script>
$(function() {
$("#tableReceiveCompanies").DataTable({
"responsive": true,
"lengthChange": false,
"autoWidth": false,
"buttons": ["copy", "csv", "excel", "pdf", "print", "colvis"]
}).buttons().container().appendTo('#tableReceiveCompanies_wrapper .col-md-6:eq(0)');
});
</script>
@endsection

View File

@ -51,7 +51,7 @@
<div class="form-group"> <div class="form-group">
<label for="user_phone">Telemovel:</label> <label for="user_phone">Telemovel:</label>
<input type="number" class="form-control" id="user_phone" name="user_phone" <input type="text" class="form-control" id="user_phone" name="user_phone"
value="{{ $pend_user->pending_user_phone }}" readonly> value="{{ $pend_user->pending_user_phone }}" readonly>
</div> </div>
@ -66,7 +66,7 @@
</div> </div>
<div class="row"> <div class="row">
<div class="col-sm-6"> <div class="col-sm">
<div class="form-group"> <div class="form-group">
<label for="user_type">Tipo de utilizador:</label> <label for="user_type">Tipo de utilizador:</label>
<select class="form-control" name="type_users" id="type_users"> <select class="form-control" name="type_users" id="type_users">
@ -76,7 +76,23 @@
</select> </select>
</div> </div>
</div> </div>
<div class="col-sm-6">
<div id="showCompanyList" class="col-sm" style="display:none;">
<div class="form-group">
<label for="user_type">Lista de Empresas:</label>
<select class="form-control" name="company" id="company">
@foreach ($allCompanies as $company)
<option value="{{ $company->company_id }}">{{ $company->company_name }}</option>
@endforeach
</select>
</div>
</div>
</div>
<div class="row">
<div class="col-sm">
<div class="form-group"> <div class="form-group">
<label for="password">Palavra-passe:</label> <label for="password">Palavra-passe:</label>
<input type="password" class="form-control" id="password" name="password" <input type="password" class="form-control" id="password" name="password"
@ -84,6 +100,7 @@
</div> </div>
</div> </div>
</div> </div>
<button type="submit" class="btn btn-light float-right">Registrar</button> <button type="submit" class="btn btn-light float-right">Registrar</button>
</form> </form>
</div> </div>
@ -91,7 +108,8 @@
{{-- ./card-light --}} {{-- ./card-light --}}
</div> </div>
</section> </section>
{{--
{{--
<div class="card"> <div class="card">
<div class="card-body"> <div class="card-body">
@ -143,4 +161,20 @@
</form> </form>
</div> </div>
</div> --}} </div> --}}
<script>
$(document).ready(function() {
// Esconde a div quando a página é carregada
$('#showCompanyList').hide();
// Função para mostrar/esconder a div baseado na seleção
$('#type_users').change(function() {
if ($(this).val() == '3') {
$('#showCompanyList').show();
} else {
$('#showCompanyList').hide();
}
});
});
</script>
@endsection @endsection

View File

@ -0,0 +1,108 @@
@extends('Templates/templateAdmin')
@section('Main-content')
@if (session('success'))
<div class="alert alert-success">
{{ session('success') }}
</div>
@endif
<section class="content-header">
<div class="container-fluid">
<div class="row mb-2">
<div class="col-sm-6">
<h1>{{__('messages.users_listUsers.top_view_part.companies')}}</h1>
</div>
<div class="col-sm-6">
<ol class="breadcrumb float-sm-right">
<li class="breadcrumb-item active">{{__('messages.users_listUsers.top_view_part.administration')}}</li>
<li class="breadcrumb-item active">{{__('messages.users_listUsers.top_view_part.companies')}}</li>
</ol>
</div>
</div>
</div>
</section>
<section class="content">
<div class="container-fluid">
<div class="card card-primary">
<div class="card-header">
<h3 class="card-title">{{__('messages.users_listUsers.top_view_part.companies_table')}}</h3>
</div>
{{-- ./card-header --}}
<div class="card-body">
<div class="table-responsive">
<table class="table table-hover text-nowrap" id="tableReceiveCompanies">
<thead>
<tr>
<th>ID</th>
<th>Nome</th>
<th>Email</th>
<th>Tipo de Utilizador</th>
<th>Ações</th>
</tr>
</thead>
<tbody>
@foreach ($users as $user)
<tr>
<td>{{ $user->user_id }}</td>
<td>{{ $user->user_name }}</td>
<td>{{ $user->email }}</td>
<td>{{ $user->userType->type_user }}</td>
<td class="table-btn-group-al">
<div class="d-flex justify-content-center dropdown">
<button data-toggle="dropdown" aria-expanded="false"
class="actions-btn btn btn-light circle ">
<i class="fa fa-ellipsis-v"></i>
</button>
<div id="group-actions-btn-14" class="dropdown-menu dropdown-menu-light">
<a href="{{ route('users.Show', ['id' => $user->user_id]) }}"
class="dropdown-item text-primary">
<i class="fa-solid fa-eye text-primary"></i>
Detalhes
</a>
<a href="{{ route('users.edit', ['id' => $user->user_id]) }}"
class="dropdown-item text-primary">
<i class="fa-solid fa-edit text-primary"></i>
Editar
</a>
<form action="{{ route('users.destroy', $user) }}" method="POST"
onsubmit="return confirm('Are you sure you want to delete this user?');"
style="display:inline;">
@csrf
@method('DELETE')
<button type="submit" class="dropdown-item text-danger">
<i class="fa-solid fa-trash-alt text-danger"></i>
Excluir
</button>
</form>
</div>
</div>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
<!-- ./table-responsive-->
</div>
<!-- /.card-body -->
</div>
{{-- ./card-light --}}
</div>
{{-- /.container-fluid" --}}
</section>
@endsection
@section('scriptsTemplateAdmin')
<script>
$(function() {
$("#tableReceiveCompanies").DataTable({
"responsive": true,
"lengthChange": false,
"autoWidth": false,
"buttons": ["copy", "csv", "excel", "pdf", "print", "colvis"]
}).buttons().container().appendTo('#tableReceiveCompanies_wrapper .col-md-6:eq(0)');
});
</script>
@endsection

View File

@ -35,20 +35,14 @@
<table class="table table-hover text-nowrap" id="tableReceiveCompanies"> <table class="table table-hover text-nowrap" id="tableReceiveCompanies">
<thead> <thead>
<tr> <tr>
<th>ID</th>
<th>Nome</th> <th>Nome</th>
<th>Email</th>
<th>Tipo de Utilizador</th>
<th>Ações</th> <th>Ações</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@foreach ($users as $user) @foreach ($companiesList as $company)
<tr> <tr>
<td>{{ $user->user_id }}</td> <td>{{ $company->company_name }}</td>
<td>{{ $user->user_name }}</td>
<td>{{ $user->email }}</td>
<td>{{ $user->userType->type_user }}</td>
<td class="table-btn-group-al"> <td class="table-btn-group-al">
<div class="d-flex justify-content-center dropdown"> <div class="d-flex justify-content-center dropdown">
<button data-toggle="dropdown" aria-expanded="false" <button data-toggle="dropdown" aria-expanded="false"
@ -56,12 +50,12 @@ class="actions-btn btn btn-light circle ">
<i class="fa fa-ellipsis-v"></i> <i class="fa fa-ellipsis-v"></i>
</button> </button>
<div id="group-actions-btn-14" class="dropdown-menu dropdown-menu-light"> <div id="group-actions-btn-14" class="dropdown-menu dropdown-menu-light">
<a href="{{ route('users.Show', ['id' => $user->user_id]) }}" <a href="{{ route('showCompany', ['id' => $company->company_id]) }}"
class="dropdown-item text-primary"> class="dropdown-item text-primary">
<i class="fa-solid fa-eye text-primary"></i> <i class="fa-solid fa-eye text-primary"></i>
Detalhes Detalhes
</a> </a>
<a href="{{ route('users.edit', ['id' => $user->user_id]) }}" {{-- <a href="{{ route('users.edit', ['id' => $user->user_id]) }}"
class="dropdown-item text-primary"> class="dropdown-item text-primary">
<i class="fa-solid fa-edit text-primary"></i> <i class="fa-solid fa-edit text-primary"></i>
Editar Editar
@ -75,7 +69,7 @@ class="dropdown-item text-primary">
<i class="fa-solid fa-trash-alt text-danger"></i> <i class="fa-solid fa-trash-alt text-danger"></i>
Excluir Excluir
</button> </button>
</form> </form> --}}
</div> </div>
</div> </div>
</td> </td>

View File

@ -5,23 +5,27 @@
<div class="container-fluid"> <div class="container-fluid">
<div class="row mb-2"> <div class="row mb-2">
<div class="col-sm-6"> <div class="col-sm-6">
@if($user->type_users == 3) {{-- @if($user->type_users == 3)
<h1 class="text-primary">Detalhes da Empresa</h1> <h1 class="text-primary">Detalhes da Empresa</h1>
@else @else
<h1 class="text-primary">Detalhes do Utilizador</h1> <h1 class="text-primary">Detalhes do Utilizador</h1>
@endif @endif --}}
<h1 class="text-primary">Detalhes do Utilizador</h1>
</div> </div>
<div class="col-sm-6"> <div class="col-sm-6">
<ol class="breadcrumb float-sm-right"> <ol class="breadcrumb float-sm-right">
<li class="breadcrumb-item active">Administração</li> <li class="breadcrumb-item active">Administração</li>
@if($user->type_users == 3) {{-- @if($user->type_users == 3)
<li class="breadcrumb-item"><a href="{{ route('users.company') }}"> Empresas</a></li> <li class="breadcrumb-item"><a href="{{ route('users.company') }}"> Empresas</a></li>
<li class="breadcrumb-item active">Detalhes da Empresa</li> <li class="breadcrumb-item active">Detalhes da Empresa</li>
@else @else
<li class="breadcrumb-item"><a href="{{ route('users.list') }}"> Utilizadores</a></li> <li class="breadcrumb-item"><a href="{{ route('users.list') }}"> Utilizadores</a></li>
<li class="breadcrumb-item active">Detalhes do Empresa</li> <li class="breadcrumb-item active">Detalhes do Empresa</li>
@endif @endif --}}
<li class="breadcrumb-item"><a href="{{ route('users.list') }}"> Utilizadores</a></li>
<li class="breadcrumb-item active">Detalhes do Empresa</li>
</ol> </ol>
</div> </div>
@ -33,11 +37,13 @@
<div class="container-fluid"> <div class="container-fluid">
<div class="card card-primary"> <div class="card card-primary">
<div class="card-header"> <div class="card-header">
@if ($user->type_users == 3) {{-- @if ($user->type_users == 3)
Empresa : {{ $user->user_name }} Empresa : {{ $user->user_name }}
@else @else
Utilizador : {{ $user->user_name }} Utilizador : {{ $user->user_name }}
@endif @endif --}}
Utilizador : {{ $user->user_name }}
</div> </div>
<div class="card-body"> <div class="card-body">
@ -80,14 +86,13 @@
<!-- Se for um Admin não deve editar --> <!-- Se for um Admin não deve editar -->
@if ($user->type_users != 1) @if ($user->type_users != 1)
@if ($user->type_users == 3) {{-- @if ($user->type_users == 3)
<a href="{{ route('users.edit', ['id' => $user->user_id]) }}" <a href="{{ route('users.edit', ['id' => $user->user_id]) }}"
class="btn btn-light float-right">Editar Empresa</a> class="btn btn-light float-right">Editar Empresa</a>
@else @else --}}
<a href="{{ route('users.edit', ['id' => $user->user_id]) }}" <a href="{{ route('users.edit', ['id' => $user->user_id]) }}"
class="btn btn-light float-right">Editar Utilizador</a> class="btn btn-light float-right">Editar Utilizador</a>
@endif @endif
@endif
@endif @endif
</div> </div>
<br> <br>

View File

@ -83,6 +83,39 @@
</head> </head>
<body class="hold-transition login-page"> <body class="hold-transition login-page">
@if (session('success'))
<div class="content">
<div class="alert alert-success" role="alert" id="alert-message-success" style="transition: opacity 1s;">
{{ session('success') }}
</div>
</div>
<script>
setTimeout(function() {
$('#alert-message-success').fadeOut('slow', function() {
$(this).remove();
});
}, 30000); // A mensagem desaparecerá após 5 segundos
</script>
@endif
@if (session('danger'))
<div class="content">
<div class="alert alert-danger" role="alert" id="alert-message-success" style="transition: opacity 1s;">
{{ session('danger') }}
</div>
</div>
<script>
setTimeout(function() {
$('#alert-message-success').fadeOut('slow', function() {
$(this).remove();
});
}, 10000); // A mensagem desaparecerá após 5 segundos
</script>
@endif
@if (count($errors) > 0) @if (count($errors) > 0)
<div class="alert alert-danger"> <div class="alert alert-danger">
{{ implode('', $errors->all('Utilizador ou palavra-passe não Coincidem')) }} {{ implode('', $errors->all('Utilizador ou palavra-passe não Coincidem')) }}

View File

@ -6,6 +6,8 @@
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<title>ISPT 4.0</title> <title>ISPT 4.0</title>
<link rel="icon" type="image/x-icon" href="{{ URL::asset('assets/dist/img/favicon.ico') }}">
<!-- Google Font: Source Sans Pro --> <!-- Google Font: Source Sans Pro -->
<link rel="stylesheet" <link rel="stylesheet"
href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700&display=fallback"> href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700&display=fallback">
@ -19,7 +21,63 @@
<link rel="stylesheet" href="{{ asset('assets/dist/css/countryFlag.css') }}"> <link rel="stylesheet" href="{{ asset('assets/dist/css/countryFlag.css') }}">
<!-- Inclusão do jQuery -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<style>
body {
animation: theme 21s linear infinite;
}
body:after,
body:before {
content: '';
display: block;
position: fixed;
z-index: -1;
top: 0;
width: 100vw;
height: 100vh;
background: rgba(0, 0, 0, 0.05);
animation: background 90s linear infinite;
}
body:after {
left: 15vw;
}
body:before {
right: 15vw;
animation-delay: -30s;
animation-direction: reverse;
}
@keyframes theme {
0%,
100% {
background: #09255C;
}
33% {
background: #EAF3F6;
}
66% {
background: #00B0EA;
}
}
@keyframes background {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
</style>
</head> </head>
@ -55,11 +113,13 @@
</div> </div>
@endif @endif
<form action="{{ route('criarUser') }}" method="POST"> <form action="{{ route('criarUser') }}" name="formCreateUser" method="POST">
@csrf @csrf
<input type="hidden" name="receiveToken" value="{{$tokenRecord->token}}">
<div class="row"> <div class="row">
<div class="col sm"> <div class="col-sm">
<div class="input-group mb-3"> <div class="input-group mb-3">
<input type="text" name="name" class="form-control" <input type="text" name="name" class="form-control"
placeholder="Primeiro Nome ..." id="name" required> placeholder="Primeiro Nome ..." id="name" required>
@ -70,7 +130,7 @@
</div> </div>
</div> </div>
</div> </div>
<div class="col sm"> <div class="col-sm">
<div class="input-group mb-3"> <div class="input-group mb-3">
<input type="text" name="lastName" class="form-control" placeholder="Apelido..." <input type="text" name="lastName" class="form-control" placeholder="Apelido..."
id="lastName" required> id="lastName" required>
@ -82,83 +142,96 @@
</div> </div>
</div> </div>
</div> </div>
<div class="col sm">
<div class="input-group mb-3"> <div class="row">
<input type="email" name="pending_email" class="form-control" placeholder="Email" <div class="col-sm">
id="pending_email" required> <div id="project-number-exists-email"></div>
<div class="input-group-append">
<div class="input-group-text"> <div class="input-group mb-3">
<span class="fas fa-user"></span> <input type="email" name="pending_email" class="form-control" placeholder="Email"
id="pending_email" data-type="email" required>
<div class="input-group-append">
<div class="input-group-text">
<span class="fa fa-envelope"></span>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col sm"> <div class="col-sm">
<div id="project-number-exists-nif"></div>
<div class="input-group mb-3"> <div class="input-group mb-3">
<input type="text" name="pending_nif" class="form-control" placeholder="Nif" <input type="text" name="pending_nif" class="form-control" placeholder="Nif"
id="pending_nif"> id="pending_nif" data-type="nif">
<div class="input-group-append"> <div class="input-group-append">
<div class="input-group-text"> <div class="input-group-text">
<span class="fas fa-user"></span> <span class="fa fa-address-card"></span>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="col sm"> <div class="col-sm">
<div id="project-number-exists-phone"></div>
<div class="input-group mb-3"> <div class="input-group mb-3">
<input type="tel" name="pending_phone" class="form-control" placeholder="Telemovel" <input type="tel" name="pending_phone" class="form-control" placeholder="Telemovel"
id="pending_phone" required> id="pending_phone" data-type="phone" required>
<div class="input-group-append"> <div class="input-group-append">
<div class="input-group-text"> <div class="input-group-text">
<span class="fas fa-user"></span> <span class="fa fa-mobile"></span>
</div> </div>
</div> </div>
</div> </div>
{{-- <div class="iti">
<input type="tel" name="phone">
</div> --}}
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col sm"> <div class="col-sm">
{{-- <div id="project-password-valid"></div> --}}
<div class="input-group mb-3"> <div class="input-group mb-3">
<input type="password" name="pending_password" class="form-control" <input type="password" name="pending_password" class="form-control"
placeholder="Password" id="pending_password" required> placeholder="Password" id="pending_password" required>
<div class="input-group-append"> <div class="input-group-append">
<div class="input-group-text"> <div class="input-group-text">
<span class="fas fa-user"></span> <span class="fa fa-key"></span>
</div> </div>
</div> </div>
</div> </div>
<div class="password-requirements">
<ul id="password-criteria" style=" display: none;">
<li id="min-length">Pelo menos 8 caracteres</li>
<li id="upper-case">Uma letra maiúscula</li>
<li id="lower-case">Uma letra minúscula</li>
<li id="one-number">Um número</li>
<li id="special-char">Um caractere especial (@$!%*?&)</li>
</ul>
</div>
</div> </div>
<div class="col sm">
<div class="col-sm">
<div id="project-password-confirm-valid"></div>
<div class="input-group mb-3"> <div class="input-group mb-3">
<input type="password" for="pending_password_confirmation" <input type="password" for="pending_password_confirmation"
name="pending_password_confirmation" class="form-control" name="pending_password_confirmation" class="form-control"
placeholder="Check Password"> placeholder="Check Password">
<div class="input-group-append"> <div class="input-group-append">
<div class="input-group-text"> <div class="input-group-text">
<span class="fas fa-user"></span> <span class="fa fa-unlock-alt"></span>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
{{-- @if ($errors->any())
<div class="alert alert-danger">
{{ implode('', $errors->all('<p>:message</p>')) }}
</div>
@endif --}}
<div class="row"> <div class="row">
<div class="col-sm-8"> <div class="col-sm-8">
</div> </div>
<div class="col-sm-4"> <div class="col-sm-4">
<button type="submit" class="btn btn-primary btn-block">Submeter</button> {{-- <button type="submit" class="btn btn-primary btn-block">Submeter</button> --}}
<button type="submit" class="btn btn-primary btn-block" id="submitBtn"
disabled>Submeter</button>
</div> </div>
</div> </div>
</form> </form>
@ -175,4 +248,278 @@
</body> </body>
<script>
$(document).ready(function() {
// Esta funcao foi necessaria, pois devido ao css e script para funcionar a exibicao das bandeiras, sem esta funcao, sempre que click no input, a selecao de bandeiras some, ate click fora do input
//Nao mexer se voce quiser, ter um select de paises bonito dentro do input XD
function ensureFlagContainerVisibility() {
const flagContainer = document.querySelector('.flag-container');
const countryList = document.querySelector('.country-list');
// Verifica se o .country-list está ativo
const isCountryListActive = countryList && countryList.classList.contains('active');
if (!flagContainer) {
console.log('Flag container não encontrado, inserindo novamente...');
// Insira o código para reinserir o .flag-container no DOM aqui
} else {
if (isCountryListActive) {
// Se .country-list estiver ativo, esconde .flag-container
flagContainer.style.display = 'none';
} else {
// Se .country-list não estiver ativo, mostra .flag-container
flagContainer.style.display = 'block'; // Garantindo que não esteja escondido
flagContainer.style.position = 'absolute'; // Mantendo a posição
flagContainer.style.left = '0px'; // Ajustando a posição horizontal conforme necessário
flagContainer.style.top = '0px'; // Ajustando a posição vertical conforme necessário
flagContainer.style.zIndex = '9999'; // Garantindo que esteja acima de outros elementos
}
}
}
// Chamando a função imediatamente para aplicar os estilos e configurações iniciais
ensureFlagContainerVisibility();
// Configurando um intervalo para verificar e aplicar os estilos periodicamente
setInterval(ensureFlagContainerVisibility, 50); // Verifica a cada 0.05 segundo
// Todas as Validacoes comecam a 'false' e se alteram em tempo real de acordo com o text em cada input
var validationState = {
pending_email: false,
pending_nif: false,
pending_phone: false,
pending_password: false,
pending_password_confirmation: false
};
// Validação AJAX
function validateField(type, value) {
$.ajax({
url: '{{ route('validateForm') }}',
type: 'GET',
data: {
_token: $('input[name="_token"]').val(), // CSRF token
type: type,
value: value
},
success: function(response) {
if (response['result_' + type] === 0) {
validationState['pending_' + type] = true;
updateSubmitButtonState();
} else {
validationState['pending_' + type] = false;
updateSubmitButtonState();
}
// console.log(response);
updateUI(type, response['result_' + type]);
},
error: function(xhr, status, error) {
console.error("Erro na validação: ", error);
}
});
}
// Função para atualizar a interface com base no resultado (Logs de resposta para cada Input)
function updateUI(type, result) {
console.log(result);
var message;
var borderColor;
//Validacoes da resposta API
switch (result) {
case 1:
message = 'O ' + type + ' já está registrado.';
borderColor = 'red';
break;
case 2:
message = 'O ' + type + ' está pendente de aprovação.';
borderColor = 'red';
break;
case 3:
message = 'O ' + type + ' já está registrado e também pendente de aprovação.';
borderColor = 'red';
break;
default:
message = 'O ' + type + ' está disponível.';
borderColor = 'green';
}
// Atualiza a mensagem e a cor da borda do input
$('#project-number-exists-' + type).text(message).css('color', borderColor);
$('input[name="pending_' + type + '"]').css('border', '2px solid ' + borderColor).removeClass(
'valid-input invalid-input').addClass(borderColor === 'red' ? 'invalid-input' :
'valid-input');
}
// Função para atualizar o estado do botão de submissão
function updateSubmitButtonState() {
var allValid = Object.values(validationState).every(isValid => isValid);
$('#submitBtn').prop('disabled', !allValid);
console.log(validationState); // Log do estado atual de validação
}
// Campo de email
$('input[name="pending_email"]').on('input', function() {
var email = $(this).val();
var type = $(this).data('type');
var emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; // Expressão regular para verificar email
if (emailRegex.test(
email)) { // Verifica se parece com um email, se sim, faz a chamada a Api
validateField(type, email);
} else {
$(this).css('border', '1px solid #ced4da').removeClass('valid-input invalid-input');
$('#project-number-exists-email').text('');
}
});
// Campo de Nif
$('input[name="pending_nif"]').on('input', function() {
var nif = $(this).val();
var type = $(this).data('type');
// Verifica se o NIF tem o comprimento correto
if (nif.length < 9) {
// Se for menor que 9 dígitos, mostra uma mensagem de erro
$(this).css('border', '2px solid red').removeClass('valid-input').addClass(
'invalid-input');
$('#project-number-exists-nif').text('O tamanho do NIF é incorreto.').css('color',
'red');
} else {
// Se tiver exatamente 9 dígitos, prossegue com a validação no sistema
validateField(type, nif);
}
// Se for necessario adicioanr um regulador para o tamanho do Nif.
// else {
// // Se tiver mais de 9 dígitos, também considera como inválido
// $(this).css('border', '2px solid red').removeClass('valid-input').addClass(
// 'invalid-input');
// $('#project-number-exists-nif').text('O NIF não deve exceder 9 dígitos.').css('color',
// 'red');
// }
});
// Campo phine
$('input[name="pending_phone"]').on('input', function() {
var phone = $(this).val();
var type = $(this).data('type');
if (phone.length < 9) {
// Se for menor que 9 dígitos, mostra uma mensagem de erro
$(this).css('border', '2px solid red').removeClass('valid-input').addClass(
'invalid-input');
$('#project-number-exists-phone').text('Numero de telemovel inexistente.').css(
'color',
'red');
} else {
validateField(type, phone);
$(this).css('border', '1px solid #ced4da').removeClass('valid-input invalid-input');
$('#project-number-exists-phone').text('');
}
});
// +
$('input[name="pending_password"]').on('focus', function() {
$('#password-criteria').show();
});
$('input[name="pending_password"]').on('blur', function() {
// Você pode adicionar condições aqui para decidir quando esconder
// Por exemplo, só esconder se a senha passar em todos os critérios
$('#password-criteria').hide();
});
// Campo de Password
$('input[name="pending_password"]').on('input', function() {
var password = $(this).val();
// Verifica o comprimento da senha
var minLength = password.length >= 8;
$('#min-length').css('color', minLength ? 'green' : 'red');
// Verifica a presença de uma letra maiúscula
var upperCase = /[A-Z]/.test(password);
$('#upper-case').css('color', upperCase ? 'green' : 'red');
// Verifica a presença de uma letra minúscula
var lowerCase = /[a-z]/.test(password);
$('#lower-case').css('color', lowerCase ? 'green' : 'red');
// Verifica a presença de um número
var oneNumber = /\d/.test(password);
$('#one-number').css('color', oneNumber ? 'green' : 'red');
// Verifica a presença de um caractere especial
var specialChar = /[@$!%*?&]/.test(password);
$('#special-char').css('color', specialChar ? 'green' : 'red');
// Verifica se todos os requisitos foram atendidos
validationState.pending_password = minLength && upperCase && lowerCase && oneNumber &&
specialChar;
if (validationState.pending_password) {
$(this).css('border', '2px solid green').removeClass('invalid-input').addClass(
'valid-input');
$('#project-password-valid').text('Senha forte.').css('color', 'green');
} else {
$(this).css('border', '2px solid red').removeClass('valid-input').addClass(
'invalid-input');
}
// Chama a função para atualizar o estado do botão de submissão, se necessário
updateSubmitButtonState();
});
$('input[name="pending_password_confirmation"]').on('input', function() {
var password = $('input[name="pending_password"]').val();
var confirmPassword = $(this).val();
// Verifica se as senhas são iguais e se a confirmação da senha tem comprimento igual à senha
if (password === confirmPassword && confirmPassword.length === password.length) {
$(this).css('border', '2px solid green').removeClass('invalid-input').addClass(
'valid-input');
$('#project-password-confirm-valid').text('As senhas coincidem.').css('color', 'green');
validationState.pending_password_confirmation = true;
} else if (confirmPassword.length < password.length) {
// Se a confirmação da senha é menor do que a senha, não faz nada (não mostra erro ainda)
$(this).css('border', '1px solid #ced4da').removeClass('invalid-input valid-input');
$('#project-password-confirm-valid').text(''); // Limpa qualquer mensagem anterior
validationState.pending_password_confirmation =
false; // Considera inválido até que os comprimentos batam
} else {
// Mostra mensagem de erro somente se os comprimentos são iguais mas as senhas não coincidem
$(this).css('border', '2px solid red').removeClass('valid-input').addClass(
'invalid-input');
$('#project-password-confirm-valid').text('As senhas não coincidem.').css('color',
'red');
validationState.pending_password_confirmation = false;
}
// Atualiza o estado do botão de submissão a cada alteração
updateSubmitButtonState();
});
// caso o usuário comece a corrigir a senha principal depois de um erro de confirmação
$('input[name="pending_password"]').on('input', function() {
// Limpa a mensagem de erro se o usuário começar a corrigir a senha principal
if ($('input[name="pending_password_confirmation"]').val() !== '') {
$('input[name="pending_password_confirmation"]').trigger('input');
}
});
});
</script>
</html> </html>

View File

@ -17,7 +17,7 @@
<body> <body>
<h1>Olá!</h1> <h1>Olá!</h1>
<p>Temos o prazer de apresentar-lhe o acesso exclusivo ao formulário do projeto 'Ispt4.0'</p> <p>Temos o prazer de apresentar-lhe o acesso exclusivo ao formulário do projeto 'Ispt4.0'</p>
<a href="{{ route('formulario') }}" target="_blank" <a href="{{ route('createUserForm', ['token' => $token]) }}" target="_blank"
style="background-color: #00B0EA; border: none; color: white; padding: 15px 32px; text-align: center; text-decoration: none; display: inline-block; font-size: 16px; margin: 4px 2px; cursor: pointer;">Acessar style="background-color: #00B0EA; border: none; color: white; padding: 15px 32px; text-align: center; text-decoration: none; display: inline-block; font-size: 16px; margin: 4px 2px; cursor: pointer;">Acessar
Formulário</a> Formulário</a>
<p>Se não estava à espera deste e-mail ou não reconhece o projeto 'Ispt4.0', por favor, ignore esta mensagem.</p> <p>Se não estava à espera deste e-mail ou não reconhece o projeto 'Ispt4.0', por favor, ignore esta mensagem.</p>

View File

@ -2,7 +2,7 @@
@section('Main-content') @section('Main-content')
@if (session('status')) @if (session('status'))
<div class="alert alert-success" role="alert"> <div class="alert alert-success m-2" role="alert">
{{ session('status') }} {{ session('status') }}
</div> </div>
@endif @endif
@ -11,12 +11,13 @@
<div class="container-fluid"> <div class="container-fluid">
<div class="row mb-2"> <div class="row mb-2">
<div class="col-sm-6"> <div class="col-sm-6">
<h1>{{__('messages.pendingUsers.create_users')}}</h1> <h1>{{ __('messages.pendingUsers.create_users') }}</h1>
</div> </div>
<div class="col-sm-6"> <div class="col-sm-6">
<ol class="breadcrumb float-sm-right"> <ol class="breadcrumb float-sm-right">
<li class="breadcrumb-item active">{{__('messages.pendingUsers.administration')}}</li> <li class="breadcrumb-item active">{{ __('messages.pendingUsers.administration') }}</li>
<li class="breadcrumb-item active"><a href="{{ route('CreateUsers') }}">{{__('messages.pendingUsers.create_users')}}</a></li> <li class="breadcrumb-item active"><a
href="{{ route('CreateUsers') }}">{{ __('messages.pendingUsers.create_users') }}</a></li>
</ol> </ol>
</div> </div>
</div> </div>
@ -29,7 +30,9 @@
<div class="card card-primary"> <div class="card card-primary">
<div class="card-header"> <div class="card-header">
<h3 class="card-title mb-0">{{__('messages.pendingUsers.submit_form')}}</h3> <h3 class="card-title mb-0">Enviar Formulario para criar Utilizador</h3>
{{-- <h3 class="card-title mb-0">{{ __('messages.pendingUsers.submit_form') }}</h3> --}}
</div> </div>
<div class="card-body"> <div class="card-body">
@ -39,18 +42,19 @@
<div class="col-sm-8"> <div class="col-sm-8">
<div class="input-group-prepend"> <div class="input-group-prepend">
<span class="input-group-text" id="form-tagEquipment"> <span class="input-group-text" id="form-tagEquipment">
<i class="fa-sharp fa-solid fa-tag" style="color: #00B0EA;"></i> <i class="fa fa-envelope" style="color: #00B0EA;"></i>
</span> </span>
<div class="has-float-label"> <div class="has-float-label">
<input type="text" name="email" class="form-control card_inputs" <input type="text" name="email" class="form-control card_inputs" id="email"
id="email" placeholder="Digite o email..." aria-label="Tag Equipment" placeholder="Digite o email..." aria-label="Tag Equipment"
aria-describedby="form-tagEquipment"> aria-describedby="form-tagEquipment">
{{-- <label>Email </label> --}} {{-- <label>Email </label> --}}
</div> </div>
</div> </div>
</div> </div>
<div class="col-sm-4 text-center"> <div class="col-sm-4 text-center">
<button type="submit" class="btn btn-light">{{__('messages.pendingUsers.submit')}}</button> <button type="submit"
class="btn btn-light">{{ __('messages.pendingUsers.submit') }}</button>
</div> </div>
</div> </div>
</form> </form>
@ -59,9 +63,40 @@
</div> </div>
{{-- ./card-light --}} {{-- ./card-light --}}
<div class="card card-success">
<div class="card-header">
<h3 class="card-title mb-0">Criar Empresas</h3>
</div>
<div class="card-body">
<form action="{{ route('createCompany') }}" method="post">
@csrf
<div class="row">
<div class="col-sm-8">
<div class="input-group-prepend">
<span class="input-group-text" id="form-tagEquipment">
<i class="fa fa-building" style="color: #00B0EA;"></i>
</span>
<div class="has-float-label">
<input type="text" name="company_name" class="form-control card_inputs" id="company_name"
placeholder="Nome da empresa..." aria-label="Tag Equipment"
aria-describedby="form-tagEquipment">
</div>
</div>
</div>
<div class="col-sm-4 text-center">
<button type="submit"
class="btn btn-light">Criar Empresa</button>
</div>
</div>
</form>
</div>
{{-- /.card-body --}}
</div>
<div class="card card-primary"> <div class="card card-primary">
<div class="card-header"> <div class="card-header">
<h2 class="card-title">{{__('messages.pendingUsers.pending_users')}}:</h2> <h2 class="card-title">{{ __('messages.pendingUsers.pending_users') }}:</h2>
</div> </div>
<div class="card-body"> <div class="card-body">
@ -70,9 +105,9 @@
id="tableReceiveAllPendingUsers"> id="tableReceiveAllPendingUsers">
<thead class="text-center"> <thead class="text-center">
<tr> <tr>
<th>{{__('messages.pendingUsers.table_pending_user.name')}}</th> <th>{{ __('messages.pendingUsers.table_pending_user.name') }}</th>
<th>{{__('messages.pendingUsers.table_pending_user.email')}}</th> <th>{{ __('messages.pendingUsers.table_pending_user.email') }}</th>
<th>{{__('messages.pendingUsers.table_pending_user.verify')}}</th> <th>{{ __('messages.pendingUsers.table_pending_user.verify') }}</th>
</tr> </tr>
</thead> </thead>
<tbody class="text-center"> <tbody class="text-center">
@ -80,7 +115,8 @@
<tr> <tr>
<td>{{ $pend_user->pending_user_name }}</td> <td>{{ $pend_user->pending_user_name }}</td>
<td>{{ $pend_user->pending_user_email }}</td> <td>{{ $pend_user->pending_user_email }}</td>
<td><a href="{{ route('ShowPendingUser', ['id' => $pend_user->pending_user_id]) }}"><i <td><a
href="{{ route('ShowPendingUser', ['id' => $pend_user->pending_user_id]) }}"><i
class="fa-solid fa-eye text-primary"></i></a></td> class="fa-solid fa-eye text-primary"></i></a></td>
</tr> </tr>
@endforeach @endforeach

View File

@ -41,7 +41,7 @@
<div class="row"> <div class="row">
<!-- Identificação do projecto --> <!-- Identificação do projecto -->
<div class="form-group col-sm-6"> <div class="form-group col-sm">
<label>{{ __('messages.createProject.project_identification') }}<b <label>{{ __('messages.createProject.project_identification') }}<b
style="color:red">*</b></label> style="color:red">*</b></label>
<input type="text" name="description_project" class="form-control" <input type="text" name="description_project" class="form-control"
@ -49,6 +49,20 @@
required> required>
</div> </div>
</div> <!-- /Row -->
<div class="row">
<!-- Gestor de Projeto ISPT -->
<div class="form-group col-sm-6">
<label>{{ __('messages.createProject.ispt_project_manager') }} <b
style="color:red">*</b></label>
<input type="text" name="responsible_project_ispt" class="form-control"
placeholder="{{ __('messages.createProject.ispt_project_manager') }}&hellip;"
required>
</div>
<!-- Número do Projeto ISPT --> <!-- Número do Projeto ISPT -->
<div class="form-group col-sm-6"> <div class="form-group col-sm-6">
<label>{{ __('messages.createProject.ispt_project_number') }}<b <label>{{ __('messages.createProject.ispt_project_number') }}<b
@ -61,27 +75,8 @@
required> required>
<div id="project-number-exists-ispt"></div> <div id="project-number-exists-ispt"></div>
</div> </div>
</div> <!-- /Row -->
<div class="row">
<!-- Gestor de Projeto ISPT -->
<div class="form-group col-sm-6">
<label>{{ __('messages.createProject.ispt_project_manager') }} <b
style="color:red">*</b></label>
<input type="text" name="responsible_project_ispt" class="form-control"
placeholder="{{ __('messages.createProject.ispt_project_manager') }}&hellip;"
required>
</div>
<!-- Gestor de Projeto da Empresa -->
<div class="form-group col-sm-6">
<label>{{ __('messages.createProject.compan_project_manager') }} <b
style="color:red">*</b></label>
<input type="text" name="responsible_project_company" class="form-control"
placeholder="{{ __('messages.createProject.compan_project_manager') }}&hellip;"
required>
</div>
</div> <!-- /Row --> </div> <!-- /Row -->
<div class="row"> <div class="row">
@ -90,18 +85,39 @@
<div class="form-group col-sm" id="companyField"> <div class="form-group col-sm" id="companyField">
<label>{{ __('messages.createProject.select_company.contracting_company') }} <b <label>{{ __('messages.createProject.select_company.contracting_company') }} <b
style="color:red">*</b></label> style="color:red">*</b></label>
<select class="form-control" name="user_id" id="company_select"> <select class="form-control" name="company_select" id="company_select">
{{-- <option>{{ __('messages.createProject.select_plant.plant') }} ...</option> --}} {{-- <option>{{ __('messages.createProject.select_plant.plant') }} ...</option> --}}
<option value="#">Selecione Uma Empresa &hellip;</option> <option value="#">Selecione Uma Empresa &hellip;</option>
{{-- <option value="new_company">Criar Empresa &hellip;</option> --}} {{-- <option value="new_company">Criar Empresa &hellip;</option> --}}
@foreach ($companies as $company) @foreach ($companies as $company)
<option value="{{ $company->user_id }}">{{ $company->user_name }}</option> <option value="{{ $company->company_id }}">{{ $company->company_name }}
</option>
@endforeach @endforeach
</select> </select>
</div> </div>
</div>
<div class="row">
<!-- Gestor de Projeto da Empresa -->
{{-- <div class="form-group col-sm" id="companyProjectManager" >
<label>{{ __('messages.createProject.compan_project_manager') }} <b
style="color:red">*</b></label>
<input type="text" name="responsible_project_company" class="form-control"
placeholder="{{ __('messages.createProject.compan_project_manager') }}&hellip;"
required>
</div> --}}
<div class="form-group col-sm" id="companyProjectManager">
<label>{{ __('messages.createProject.compan_project_manager') }}
<b style="color:red">*</b></label>
<select class="form-control" name="user_id" id="user_id" required>
<!-- As opções de instalação serão preenchidas dinamicamente -->
</select>
</div>
<!-- Instalação --> <!-- Instalação -->
<div class="form-group col-sm" id="installationField" hidden> <div class="form-group col-sm" id="installationField">
<label>{{ __('messages.createProject.select_plant.plant') }} <b <label>{{ __('messages.createProject.select_plant.plant') }} <b
style="color:red">*</b></label> style="color:red">*</b></label>
<select class="form-control" name="installation_id" id="installationSelect" <select class="form-control" name="installation_id" id="installationSelect"
@ -151,8 +167,6 @@
</div> </div>
<div class="row"> <div class="row">
<!-- Número do Projeto da Empresa --> <!-- Número do Projeto da Empresa -->
@ -225,7 +239,7 @@ class="btn btn-primary">{{ __('messages.buttons.save') }}</button>
} }
}); });
}); });
</script> </script>
{{-- <script> {{-- <script>
@ -399,56 +413,202 @@ function updateSubmitButtonState() {
}); });
</script> </script>
{{-- <script>
$(document).ready(function() {
// Esconde os elementos no carregamento da página
$('#companyProjectManager').hide();
$('#installationField').hide();
$('#localization_installation_client').hide();
$('#new_company_div').hide();
$('#company_select').change(function() {
var companyId = $(this).val();
var userManagerSelect = $('#user_id'); // Define a variável corretamente
// Se a seleção é '#', esconde os elementos e retorna
if (companyId === '#' || companyId === '') {
$('#companyProjectManager').hide();
$('#installationField').hide();
return;
}
// Se a seleção é válida (diferente de '#'), mostra os elementos
$('#companyProjectManager').show();
$('#installationField').show();
// Limpa o select antes de adicionar novas opções
userManagerSelect.empty();
userManagerSelect.append('<option value="#">Selecione um usuário...</option>');
// Busca dados combinados de gestores e instalações
$.get('/api/installations?company_id=' + companyId, function(response) {
console.log(response);
response.users.forEach(function(user) {
userManagerSelect.append('<option value="' + user.user_id + '">' +
user.user_name + '</option>');
});
});
});
});
</script> --}}
<script> <script>
$(document).ready(function() { $(document).ready(function() {
// Esconde os elementos no carregamento da página // Esconde os elementos no carregamento da página
$('#companyProjectManager').hide();
$('#installationField').hide();
$('#localization_installation_client').hide(); $('#localization_installation_client').hide();
$('#new_company_div').hide(); $('#new_company_div').hide();
$('#installationField').attr('hidden', 'hidden');
$('#company_select').change(function() { $('#company_select').change(function() {
var user_id = $(this).val(); var companyId = $(this).val();
var userManagerSelect = $('#user_id'); // Define a variável corretamente
var installationSelect = $(
'#installationSelect'); // Define a variável para o select de instalações
// Se a seleção é 'Criar Empresa ...' // Se a seleção é '#', esconde os elementos e retorna
if (user_id === 'new_company') { if (companyId === '#' || companyId === '') {
$('#new_company_div').show(); $('#companyProjectManager').hide();
$('#installationField').attr('hidden', 'hidden'); $('#installationField').hide();
$('#localization_installation_client').hide();
return;
} else {
$('#new_company_div').hide();
}
// Se a seleção é o placeholder ou '#'
if (user_id == '#' || user_id === '') {
$('#installationField').attr('hidden', 'hidden');
$('#localization_installation_client').hide(); $('#localization_installation_client').hide();
$('#new_company_div').hide(); $('#new_company_div').hide();
return; return;
} }
$.get('/api/installations?user_id=' + user_id, function(data) { // Se a seleção é válida (diferente de '#'), mostra os elementos
var select = $('#installationSelect'); $('#companyProjectManager').show();
select.empty(); $('#installationField').show();
// Adicione as opções fixas aqui // Limpa o select antes de adicionar novas opções
select.append('<option value="#">Selecione uma instalação...</option>'); userManagerSelect.empty();
select.append( userManagerSelect.append('<option value="#">Selecione um usuário...</option>');
'<option value="new_install">Criar uma nova Instalação ?</option>');
// Agora você pode adicionar suas opções dinâmicas. // Adiciona a opção de 'Criar instalação'
$.each(data, function(index, installation) { installationSelect.empty(); // Garante que o select de instalações esteja vazio
select.append('<option value="' + installation.plant_id + '">' + installationSelect.append(
installation.plant_name + '</option>'); '<option value="#">Selecione uma instalação...</option>'); // Opção placeholder
installationSelect.append(
'<option value="new_install">Criar instalação</option>'); // Opção para criar nova instalação
// Busca dados combinados de gestores e instalações
$.get('/api/installations?company_id=' + companyId, function(response) {
console.log(response);
response.users.forEach(function(user) {
userManagerSelect.append('<option value="' + user.user_id + '">' +
user.user_name + '</option>');
}); });
// Armazene os dados em installationsData
installationsData = data;
$('#installationField').removeAttr('hidden');
}); });
}); });
// Trata a mudança de seleção no select de instalações
$('#installationSelect').change(function() {
var selectedValue = $(this).val();
// Se a opção selecionada é 'Criar instalação'
if (selectedValue === 'new_install') {
$('#localization_installation_client').hide();
$('#new_company_div').show(); // Mostra o div para criar nova instalação
} else {
$('#localization_installation_client')
.show(); // Caso contrário, mostra os demais elementos relevantes
$('#new_company_div').hide();
}
});
});
</script>
{{-- <script>
$(document).ready(function() {
// $('#installationField').attr('hidden', 'hidden');
// Esconde os elementos no carregamento da página
$('#companyProjectManager').hide();
$('#installationField').hide();
$('#localization_installation_client').hide();
$('#new_company_div').hide();
$('#company_select').change(function() {
var companyId = $(this).val();
// Se a seleção é '#', esconde os elementos e retorna
if (companyId === '#' || companyId === '') {
$('#companyProjectManager').hide();
$('#installationField').hide();
return;
}
// Se a seleção é válida (diferente de '#'), mostra os elementos
$('#companyProjectManager').show();
$('#installationField').show();
// Limpa o select antes de adicionar novas opções
userManagerSelect.empty();
userManagerSelect.append('<option value="#">Selecione um usuário...</option>');
// Busca dados combinados de gestores e instalações
$.get('/api/installations?company_id=' + companyId, function(response) {
console.log(response);
response.users.forEach(function(user) {
userManagerSelect.append('<option value="' + user.user_id + '">' +
user.user_name + '</option>');
});
});
// $.get('/api/installations?company_id=' + companyId, function(response) {
// var select = $('#installationSelect');
// select.empty();
// // Adicione as opções fixas aqui
// select.append('<option value="#">Selecione uma instalação...</option>');
// select.append(
// '<option value="new_install">Criar uma nova Instalação ?</option>');
// // Agora você pode adicionar suas opções dinâmicas.
// $.each(data, function(index, installation) {
// select.append('<option value="' + installation.plant_id + '">' +
// installation.plant_name + '</option>');
// });
// // Armazene os dados em installationsData
// installationsData = data;
// $('#installationField').removeAttr('hidden');
// });
});
// $('#company_select').change(function() {
// var user_id = $(this).val();
// // Se a seleção é 'Criar Empresa ...'
// if (user_id === 'new_company') {
// $('#new_company_div').show();
// $('#installationField').attr('hidden', 'hidden');
// $('#localization_installation_client').hide();
// return;
// } else {
// $('#new_company_div').hide();
// }
// // Se a seleção é o placeholder ou '#'
// if (user_id == '#' || user_id === '') {
// $('#installationField').attr('hidden', 'hidden');
// $('#localization_installation_client').hide();
// $('#new_company_div').hide();
// return;
// }
// });
$('#installationSelect').change(function() { $('#installationSelect').change(function() {
var selectedValue = $(this).val(); var selectedValue = $(this).val();
@ -484,7 +644,7 @@ function updateSubmitButtonState() {
} }
}); });
}); });
</script> </script> --}}
<script type="text/javascript"> <script type="text/javascript">
let formSubmitted = false; let formSubmitted = false;
@ -514,5 +674,4 @@ function addBeforeUnload() {
}); });
} }
</script> </script>
@endsection @endsection

View File

@ -47,7 +47,8 @@
Route::get('/checkProjectIsptNumber/{projectId?}',[ProjectoDatacontroller::class,'checkProjectIsptNumber'])->name('checkProjectIsptNumber'); Route::get('/checkProjectIsptNumber/{projectId?}',[ProjectoDatacontroller::class,'checkProjectIsptNumber'])->name('checkProjectIsptNumber');
Route::post('deletePendingEquipments', [CreateProjectController::class, 'deletePendingEquipments'])->name('deletePendingEquipments'); Route::post('deletePendingEquipments', [CreateProjectController::class, 'deletePendingEq
uipments'])->name('deletePendingEquipments');
@ -103,9 +104,15 @@
Route::post('language/switch', [LanguageController::class, 'switchLanguage'])->name('language.switch'); Route::post('language/switch', [LanguageController::class, 'switchLanguage'])->name('language.switch');
// Esta rota so pode aceder quem tiver o link atravez do email // Esta rota so pode aceder quem tiver o link atravez do email
Route::get('formulario', function () { // Route::get('formulario', function () {
return view('email/FormAdmin'); // return view('email/FormAdmin');
})->name('formulario'); // })->name('formulario');
Route::get('createUserForm', [FormController::class, 'createUserForm'])->name('createUserForm');
Route::get('/validate-form', [Pending_UserController::class, 'validateForm'])->name('validateForm');
Route::post('formulario/receive', [Pending_UserController::class, 'store'])->name('criarUser'); Route::post('formulario/receive', [Pending_UserController::class, 'store'])->name('criarUser');
@ -200,6 +207,9 @@
Route::delete('users/{user}', 'destroy')->name('users.destroy'); Route::delete('users/{user}', 'destroy')->name('users.destroy');
Route::post('editProfile/{id}', 'EditProfile')->name('editProfile'); Route::post('editProfile/{id}', 'EditProfile')->name('editProfile');
Route::get('company/{id}','showCompany')->name('showCompany');
Route::post('createCompany','createCompany')->name('createCompany');
}); });
Route::post('editEquipmentTasks/{equipmentID}/{projectId}',[ProjectoDatacontroller::class,'editEquipmentTasks'])->name('editEquipmentTasks'); Route::post('editEquipmentTasks/{equipmentID}/{projectId}',[ProjectoDatacontroller::class,'editEquipmentTasks'])->name('editEquipmentTasks');