This commit is contained in:
2026-02-12 17:56:16 +00:00
parent a4f80c85c2
commit 2ffd916e2f
27 changed files with 1181 additions and 60 deletions

View File

@@ -0,0 +1,30 @@
<?php
namespace App\Http\Controllers;
use App\Models\alunos;
use App\Models\turmas;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class AlunosController extends Controller
{
public function index()
{
$escolaId = Auth::user()->id_escola;
if ($escolaId == 0) {
$alunos = alunos::all();
} else {
$alunos = [];
$turmas = turmas::where('id_escola', $escolaId)->get();
foreach ($turmas as $turma) {
$alunosget = alunos::where('id_turma', $turma->id)->get();
foreach ($alunosget as $alunosg) {
$alunos[] = $alunosg;
}
}
}
return view('escolas.alunos', compact('alunos'));
}
}

View File

@@ -0,0 +1,61 @@
<?php
namespace App\Http\Controllers;
use App\Models\turmas;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;
class EnvioWhatsap extends Controller
{
public function envio(Request $request)
{
$request->validate([
'id_turma' => 'required|exists:turmas,id',
'tipo_envio' => 'required|in:texto,imagem',
'mensagem' => 'nullable|string',
'imagem' => 'required_if:tipo_envio,imagem|image|mimes:jpeg,png,webp|max:2048',
]);
$turma = turmas::findOrFail($request->id_turma);
// Corrigir formatação para WhatsApp
$mensagem = $request->mensagem ?? '';
$mensagem = str_replace(['**', '__', '~~'], ['*', '_', '~'], $mensagem);
$payload = [
'chatId' => $turma->id_whatsapp,
'mensagem' => $mensagem,
];
// ✅ Se for envio com imagem
if ($request->tipo_envio === 'imagem' && $request->hasFile('imagem')) {
$file = $request->file('imagem');
$base64 = base64_encode(
file_get_contents($file->getRealPath())
);
$mime = $file->getMimeType(); // image/png, image/jpeg, etc
// 🔥 AQUI está o prefixo obrigatório
$base64Completo = "data:$mime;base64,$base64";
$payload['imagem'] = $base64Completo;
}
// ✅ Enviar para API
$response = Http::withHeaders([
'X-API-KEY' => 'UoCkSF4ApgADhpvDkkE5XO1fD761yOZX',
'Content-Type' => 'application/json',
])->post('https://n8n.cae.app.br/webhook/envioWpp', $payload);
// ✅ Retorno amigável
if ($response->successful()) {
return back()->with('success', 'Mensagem enviada com sucesso!');
}
return back()->with('error', 'Erro ao enviar: ' . $response->body());
}
}

View File

@@ -0,0 +1,37 @@
<?php
namespace App\Http\Controllers;
use App\Models\escolas;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class EscolasController extends Controller
{
public function index()
{
if (Auth::user()->id_escola == 0) {
$escolas = escolas::all();
} else {
$escolas = escolas::where('id', Auth::user()->id_escola)->get();
}
return view('escolas.index', compact('escolas'));
}
public function createOrUpdate(Request $request)
{
try {
escolas::updateOrCreate([
'cnpj' => $request->cnpj,
],[
'nome' => $request->razaosocial,
'endereco' => json_decode($request->address, true),
]);
return redirect()->route('escolas')->with('success', 'Escola Criada|Atualizada com sucesso');
} catch (\Throwable $th) {
dd($th);
}
}
}

View File

@@ -0,0 +1,10 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class HistoricoEscolarController extends Controller
{
//
}

View File

@@ -0,0 +1,52 @@
<?php
namespace App\Http\Controllers;
use App\Models\turmas;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class TurmasController extends Controller
{
public function index()
{
if (Auth::user()->id_escola == 0) {
$turmas = turmas::all();
} else {
$turmas = turmas::where('id_escola', Auth::user()->id_escola)->get();
}
return view('escolas.turmas', compact('turmas'));
}
public function createOrUpdate(Request $request)
{
$turma = turmas::where('nome', '=', $request->turma_nome)->count();
if ($turma == 0) {
try {
$turma = new turmas();
$turma->id_escola = $request->id_escola;
$turma->nome = $request->turma_nome;
$turma->descricao = $request->turma_descricao;
$turma->id_whatsapp = $request->id_whatsapp;
$turma->save();
return redirect()->route('turmas')->with('success', 'Turma Criada|Atualizada com sucesso.');
} catch (\Throwable $th) {
dd($th);
}
} else {
try {
turmas::where('nome', $request->turma_nome)->update([
'nome' => $request->turma_nome,
'descricao' => $request->turma_descricao,
'id_escola' => $request->id_escola,
'id_whatsapp' => $request->id_whatsapp,
]);
return redirect()->route('turmas')->with('success', 'Turma Criada|Atualizada com sucesso.');
} catch (\Throwable $th) {
//throw $th;
}
}
}
}

17
app/Models/alunos.php Normal file
View File

@@ -0,0 +1,17 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class alunos extends Model
{
public function turma()
{
return $this->belongsTo(turmas::class, 'id_turma', 'id');
}
public function responsaveis() {
return $this->hasMany(User::class, 'id', 'id_responsavel');
}
}

23
app/Models/escolas.php Normal file
View File

@@ -0,0 +1,23 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class escolas extends Model
{
protected $casts = [
'endereco' => 'array',
];
protected $fillable = [
'cnpj',
'endereco',
'nome',
];
public function turmas()
{
return $this->hasMany(turmas::class, 'id_escola', 'id');
}
}

View File

@@ -0,0 +1,10 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class historico_escolar extends Model
{
//
}

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

@@ -0,0 +1,22 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class turmas extends Model
{
protected $fillable = [
'nome',
'descricao',
];
public function escola()
{
return $this->hasOne(escolas::class, 'id', 'id_escola');
}
public function alunos()
{
return $this->hasMany(alunos::class, 'id', 'id_turma');
}
}

View File

@@ -0,0 +1,31 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('users', function (Blueprint $table) {
$table->integer('id_escola')->nullable();
$table->string('profile')->nullable();
$table->string('cpf')->nullable();
$table->json('endereco')->nullable();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('users', function (Blueprint $table) {
//
});
}
};

View File

@@ -0,0 +1,30 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('users', function (Blueprint $table) {
$table->integer('id_escola')->nullable()->after('created_at')->change();
$table->string('profile')->nullable()->after('id_escola')->change();
$table->string('cpf')->nullable()->after(column: 'profile')->change();
$table->json('endereco')->nullable()->after('cpf')->change();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('users', function (Blueprint $table) {
//
});
}
};

View File

@@ -0,0 +1,30 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('escolas', function (Blueprint $table) {
$table->id();
$table->string('cnpj')->unique();
$table->string('nome');
$table->json('endereco');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('escolas');
}
};

View File

@@ -0,0 +1,30 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('turmas', function (Blueprint $table) {
$table->id();
$table->integer('id_escola');
$table->string('nome');
$table->string('descricao');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('turmas');
}
};

View File

@@ -0,0 +1,35 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('alunos', function (Blueprint $table) {
$table->id();
$table->integer('id_responsavel');
$table->integer('id_turma');
$table->string('nome');
$table->date('data_nascimento');
$table->date('data_inscricao');
$table->date('data_encerramento');
$table->string('cpf')->unique();
$table->json('endereco');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('alunos');
}
};

View File

@@ -0,0 +1,29 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('historico_escolars', function (Blueprint $table) {
$table->id();
$table->integer('id_aluno');
$table->longText('historico');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('historico_escolars');
}
};

View File

@@ -0,0 +1,29 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('alunos', function (Blueprint $table) {
$table->date('data_encerramento')->nullable()->change();
$table->json('endereco')->nullable()->change();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('alunos', function (Blueprint $table) {
//
});
}
};

View File

@@ -0,0 +1,28 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('turmas', function (Blueprint $table) {
$table->string('id_whatsapp');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('turmas', function (Blueprint $table) {
//
});
}
};

View File

@@ -5099,6 +5099,20 @@ textarea.form-control-lg {
border-top-width: 1px;
}
.dropdown.show .gear-icon {
animation: spin 1.2s linear infinite;
}
@keyframes spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
.list-group-horizontal {
-webkit-box-orient: horizontal;
-webkit-box-direction: normal;

Binary file not shown.

After

Width:  |  Height:  |  Size: 188 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

View File

@@ -12,7 +12,7 @@
<meta name="author" content="pixelstrap">
<link rel="icon" href="../assets/images/favicon.png" type="image/x-icon">
<link rel="shortcut icon" href="../assets/images/favicon.png" type="image/x-icon">
<title>Escola da Árvore - Administração de comunicação</title>
<title>{{ env('APP_NAME') }} - Login</title>
<!-- Google font-->
<link rel="preconnect" href="https://fonts.gstatic.com">
<link
@@ -43,17 +43,6 @@
<link id="color" rel="stylesheet" href="../assets/css/color-1.css" media="screen">
<!-- Responsive css-->
<link rel="stylesheet" type="text/css" href="../assets/css/responsive.css">
<script type="text/javascript">
window.onload = function () {
(function (d, script) {
script = d.createElement('script');
script.type = 'text/javascript';
script.async = true;
script.src = 'https://w.app/widget-v1/lNOnXt.js';
d.getElementsByTagName('head')[0].appendChild(script);
}(document));
};
</script>
</head>
<body>
@@ -69,14 +58,14 @@
<div class="container-fluid">
<div class="row">
<div class="col-xl-7"><img class="bg-img-cover bg-center"
src="https://static.wixstatic.com/media/41ee35_73bd5b9e15d344a1b7f397306f721050~mv2.jpg/v1/fill/w_665,h_620,al_c,q_85,usm_0.66_1.00_0.01,enc_avif,quality_auto/41ee35_73bd5b9e15d344a1b7f397306f721050~mv2.jpg"
src="{{ asset('assets/images/login.jpg') }}"
alt="looginpage"></div>
<div class="col-xl-5 p-0">
<div class="login-card">
<form method="POST" action="{{ route('login') }}" class="theme-form login-form">
@csrf
<h4>Login</h4>
<h6>Seja bem vindo(a) ao sistema de comunicação da turma Duguetia.</h6>
<h6>Seja bem vindo(a) ao CAE</h6>
<div class="form-group">
<label>Email</label>
<div class="input-group"><span class="input-group-text"><i class="icon-email"></i></span>

View File

@@ -0,0 +1,74 @@
@extends('theme.default')
@section('title', 'Alunos')
@section('title.page', 'Alunos')
@section('title.page1', 'CAE')
@section('title.page2', 'Alunos')
@section('title.page3', 'Lista de alunos')
@section('content')
<div class="row">
<div class="col-sm-12">
<div class="card">
<div class="card-block row">
<div class="col-sm-12 col-lg-12 col-xl-12">
<div class="table-responsive">
<table class="table">
<thead class="bg-primary">
<tr>
<th scope="col">#</th>
<th scope="col">Nome</th>
<th scope="col">CPF</th>
<th scope="col">Escola</th>
<th scope="col">Turma</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach ($alunos as $aluno)
<tr>
<th scope="row">{{ $aluno->id }}</th>
<td>{{ $aluno->nome }}</td>
<td>{{ $aluno->cpf }}</td>
<td>{{ $aluno->turma->escola->nome }}</td>
<td>{{ $aluno->turma->nome }}</td>
<td>
<div class="dropdown">
<button class="btn btn-link p-0 gear-btn" type="button"
data-bs-toggle="dropdown" aria-expanded="false">
<i data-feather="settings" class="gear-icon bg-primary"></i>
</button>
<ul class="dropdown-menu dropdown-menu-end">
<li>
<form action="editar.php" method="post">
<input type="hidden" name="id" value="123">
<button type="submit" class="dropdown-item">
Editar
</button>
</form>
</li>
<li>
<form action="excluir.php" method="post"
onsubmit="return confirm('Tem certeza que deseja excluir?')">
<input type="hidden" name="id" value="123">
<button type="submit" class="dropdown-item text-danger">
Excluir
</button>
</form>
</li>
</ul>
</div>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
@endsection

View File

@@ -0,0 +1,89 @@
@extends('theme.default')
@section('title', 'Escolas')
@section('title.page', 'Escolas')
@section('title.page1', 'CAE')
@section('title.page2', 'Escolas')
@section('title.page3', 'Lista de escolas')
@section('content')
<div class="row">
<div class="col-sm-12">
<div class="card">
<div class="card-block row">
<div class="col-sm-12 col-lg-12 col-xl-12">
<div class="table-responsive">
<table class="table">
<thead class="bg-primary">
<tr>
<th scope="col">#</th>
<th scope="col">Nome</th>
<th scope="col">CNPJ</th>
<th scope="col"></th>
<th scope="col"></th>
<th scope="col"></th>
<th scope="col"></th>
</tr>
</thead>
<tbody>
@foreach ($escolas as $escola)
<tr>
<th scope="row">{{$escola->id}}</th>
<td>{{$escola->nome}}</td>
<td>{{$escola->cnpj}}</td>
<td>
<span>Endereço:</span>
<p>{{ $escola->endereco['street'] }} {{ $escola->endereco['number'] }}
</p>
</td>
<td>
<span>Complemento:</span>
<p>{{ $escola->endereco['details'] }} </p>
</td>
<td>
<span>Cep:</span>
<p>{{ $escola->endereco['zip'] }}</p>
</td>
<td>
<div class="dropdown">
<button class="btn btn-link p-0 gear-btn" type="button"
data-bs-toggle="dropdown" aria-expanded="false">
<i data-feather="settings" class="gear-icon bg-primary"></i>
</button>
<ul class="dropdown-menu dropdown-menu-end">
<li>
<form action="editar.php" method="post">
<input type="hidden" name="id" value="123">
<button type="submit" class="dropdown-item">
Editar
</button>
</form>
</li>
<li>
<form action="excluir.php" method="post"
onsubmit="return confirm('Tem certeza que deseja excluir?')">
<input type="hidden" name="id" value="123">
<button type="submit" class="dropdown-item text-danger">
Excluir
</button>
</form>
</li>
</ul>
</div>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
@endsection

View File

@@ -0,0 +1,79 @@
@extends('theme.default')
@section('title', 'Turmas')
@section('title.page', 'Turmas')
@section('title.page1', 'CAE')
@section('title.page2', 'Turmas')
@section('title.page3', 'Lista de turmas')
@section('content')
<div class="row">
<div class="col-sm-12">
<div class="card">
<div class="card-block row">
<div class="col-sm-12 col-lg-12 col-xl-12">
<div class="table-responsive">
<table class="table">
<thead class="bg-primary">
<tr>
<th scope="col">#</th>
<th scope="col">Escola</th>
<th scope="col">Nome</th>
<th scope="col">Descrição</th>
<th scope="col">Whatsap</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach ($turmas as $turma)
<tr>
<th scope="row">{{ $turma->id }}</th>
<td>{{ $turma->escola->nome }}</td>
<td>{{ $turma->nome }}</td>
<td>{{ $turma->descricao }}</td>
<td>{{ $turma->id_whatsapp }}</td>
<td>
<div class="dropdown">
<button
class="btn btn-link p-0 gear-btn"
type="button"
data-bs-toggle="dropdown"
aria-expanded="false"
>
<i data-feather="settings" class="gear-icon bg-primary"></i>
</button>
<ul class="dropdown-menu dropdown-menu-end">
<li>
<form action="editar.php" method="post">
<input type="hidden" name="id" value="123">
<button type="submit" class="dropdown-item">
Editar
</button>
</form>
</li>
<li>
<form action="excluir.php" method="post"
onsubmit="return confirm('Tem certeza que deseja excluir?')">
<input type="hidden" name="id" value="123">
<button type="submit" class="dropdown-item text-danger">
Excluir
</button>
</form>
</li>
</ul>
</div>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
@endsection

View File

@@ -5,9 +5,9 @@
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" href="../assets/images/favicon.jpg" type="image/x-icon">
<link rel="shortcut icon" href="../assets/images/favicon.jpg" type="image/x-icon">
<title>Escola da Árvore - @yield('title')</title>
<link rel="icon" href="{{asset('assets/images/logo3.png')}}" type="image/x-icon">
<link rel="shortcut icon" href="{{asset('assets/images/favicon.jpg')}}" type="image/x-icon">
<title>{{ env('APP_NAME') }} - @yield('title')</title>
<!-- Google font-->
<link rel="preconnect" href="https://fonts.gstatic.com">
<link
@@ -20,27 +20,44 @@
href="https://fonts.googleapis.com/css2?family=Rubik:ital,wght@0,400;0,500;0,600;0,700;0,800;0,900;1,300;1,400;1,500;1,600;1,700;1,800;1,900&amp;display=swap"
rel="stylesheet">
<!-- Font Awesome-->
<link rel="stylesheet" type="text/css" href="../assets/css/fontawesome.css">
<link rel="stylesheet" type="text/css" href="{{ asset('assets/css/fontawesome.css')}}">
<!-- ico-font-->
<link rel="stylesheet" type="text/css" href="../assets/css/icofont.css">
<link rel="stylesheet" type="text/css" href="{{ asset('assets/css/icofont.css')}}">
<!-- Themify icon-->
<link rel="stylesheet" type="text/css" href="../assets/css/themify.css">
<link rel="stylesheet" type="text/css" href="{{ asset('assets/css/themify.css')}}">
<!-- Flag icon-->
<link rel="stylesheet" type="text/css" href="../assets/css/flag-icon.css">
<link rel="stylesheet" type="text/css" href="{{ asset('assets/css/flag-icon.css')}}">
<!-- Feather icon-->
<link rel="stylesheet" type="text/css" href="../assets/css/feather-icon.css">
<link rel="stylesheet" type="text/css" href="{{ asset('assets/css/feather-icon.css')}}">
<!-- Plugins css start-->
<!-- Plugins css Ends-->
<!-- Bootstrap css-->
<link rel="stylesheet" type="text/css" href="../assets/css/bootstrap.css">
<link rel="stylesheet" type="text/css" href="{{ asset('assets/css/bootstrap.css')}}">
<!-- App css-->
<link rel="stylesheet" type="text/css" href="../assets/css/style.css">
<link id="color" rel="stylesheet" href="../assets/css/color-1.css" media="screen">
<link rel="stylesheet" type="text/css" href="{{ asset('assets/css/style.css')}}">
<link id="color" rel="stylesheet" href="{{ asset('assets/css/color-1.css')}}" media="screen">
<!-- Responsive css-->
<link rel="stylesheet" type="text/css" href="../assets/css/responsive.css">
<link rel="stylesheet" type="text/css" href="{{ asset('assets/css/responsive.css')}}">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/simplemde/latest/simplemde.min.css">
<link rel="stylesheet" type="text/css" href="{{ asset('assets/css/dropzone.css') }}">
</head>
<body>
@php
use App\Models\escolas;
use App\Models\turmas;
if (Auth::user()->id_escola == 0) {
$escolas = escolas::all();
} else {
$escolas = escolas::where('id', Auth::user()->id_escola)->get();
}
if (Auth::user()->id_escola == 0) {
$turmas = turmas::all();
} else {
$turmas = turmas::where('id_escola', Auth::user()->id_escola)->get();
}
@endphp
<!-- Loader starts-->
<div class="loader-wrapper">
<div class="theme-loader">
@@ -54,10 +71,6 @@
<div class="page-main-header">
<div class="main-header-right row m-0">
<div class="main-header-left">
<div class="logo-wrapper"><a href="index.html"><img class="img-fluid"
src="../assets/images/logo2.png" alt=""></a></div>
<div class="dark-logo-wrapper"><a href="index.html"><img class="img-fluid"
src="../assets/images/logo2.png" alt=""></a></div>
<div class="toggle-sidebar"><i class="status_toggle middle" data-feather="align-center"
id="sidebar-toggle"></i></div>
</div>
@@ -76,6 +89,26 @@
<ul class="nav-menus">
<li><a class="text-dark" href="#!" onclick="javascript:toggleFullScreen()"><i
data-feather="maximize"></i></a></li>
<li>
<div class="dropdown-basic">
<div class="dropdown">
<div class="btn-group mb-0">
<button class="dropbtn btn-primary btn-round" type="button">
Novo <span><i class="icofont icofont-arrow-down"></i></span>
</button>
<div class="dropdown-content">
<a href="#" data-bs-toggle="modal" data-bs-target="#modalEscola">Escola</a>
<a href="#" data-bs-toggle="modal" data-bs-target="#modalTurma">Turma</a>
<a href="#" data-bs-toggle="modal" data-bs-target="#modalAluno">Aluno</a>
<a href="#" data-bs-toggle="modal" data-bs-target="#modalEnvio">Envio de
Mensagem</a>
<a href="#" data-bs-toggle="modal" data-bs-target="#modalEvento">Evento</a>
</div>
</div>
</div>
</div>
</li>
<li class="onhover-dropdown p-0">
<form method="POST" action="{{ route('logout') }}">
@csrf
@@ -97,7 +130,7 @@
<header class="main-nav">
<div class="sidebar-user text-center"><a class="setting-primary" href="javascript:void(0)"><i
data-feather="settings"></i></a><img class="img-90 rounded-circle"
src="../assets/images/dashboard/1.png" alt="">
src="{{ asset('assets/images/logo3.png')}}" alt="">
<div class="badge-bottom"><span class="badge badge-primary">Responsável</span></div><a
href="user-profile.html">
<h6 class="mt-3 f-14 f-w-600">{{ Auth::user()->name }}</h6>
@@ -114,11 +147,25 @@
</li>
<li class="sidebar-main-title">
<div>
<h6>Dashboard </h6>
<h6>Geral </h6>
</div>
</li>
<li class="dropdown"><a class="nav-link menu-title link-nav" href=""><i
data-feather="git-pull-request"></i><span>Dashboard</span></a></li>
<li class="sidebar-main-title">
<div>
<h6>Administração </h6>
</div>
</li>
<li class="dropdown"><a class="nav-link menu-title link-nav"
href="{{ route('escolas') }}"><i
data-feather="award"></i><span>Escolas</span></a></li>
<li class="dropdown"><a class="nav-link menu-title link-nav"
href="{{ route('turmas') }}"><i data-feather="award"></i><span>Turmas</span></a>
</li>
<li class="dropdown"><a class="nav-link menu-title link-nav"
href="{{ route('alunos') }}"><i data-feather="award"></i><span>Alunos</span></a>
</li>
</ul>
</div>
<div class="right-arrow" id="right-arrow"><i data-feather="arrow-right"></i></div>
@@ -148,24 +195,7 @@
</div>
<!-- Container-fluid starts-->
<div class="container-fluid">
<div class="row">
<div class="col-sm-12">
<div class="card">
<div class="card-header pb-0">
<h5>Sample Card</h5><span>lorem ipsum dolor sit amet, consectetur adipisicing
elit</span>
</div>
<div class="card-body">
<p>"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu
fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
culpa qui officia deserunt mollit anim id est laborum."</p>
</div>
</div>
</div>
</div>
@yield('content')
</div>
<!-- Container-fluid Ends-->
</div>
@@ -183,23 +213,355 @@
</footer>
</div>
</div>
<div class="modal fade" id="modalEscola" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">Nova Escola</h4>
<button class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">
<form class="form theme-form" action="{{ route('escola.novo') }}" method="POST">
@csrf
<div class="card-body">
<div class="row">
<div class="col-4">
<div class="mb-3">
<label class="form-label" for="cnoj">CNPJ</label>
<input class="form-control" id="cnpj" name="cnpj" type="text">
</div>
</div>
<div class="col-8">
<div class="mb-3">
<label class="form-label" for="razao_social">Razão Social</label>
<input class="form-control" id="razao_social" name="razaosocial" type="text">
</div>
</div>
</div>
<div class="row">
<div class="col-6">
<div class="mb-3">
<label class="form-label" for="logradouro">Logradouro</label>
<input class="form-control" id="logradouro" type="text" disabled>
</div>
</div>
<div class="col-3">
<div class="mb-3">
<label class="form-label" for="numero">Número</label>
<input class="form-control" id="numero" type="text" disabled>
</div>
</div>
<div class="col-3">
<div class="mb-3">
<label class="form-label" for="cep">CEP</label>
<input class="form-control" id="cep" type="text" disabled>
</div>
</div>
</div>
<div class="row">
<div class="col-4">
<div class="mb-3">
<label class="form-label" for="complemento">Complemento</label>
<input class="form-control" id="complemento" type="text" disabled>
</div>
</div>
<div class="col-3">
<div class="mb-3">
<label class="form-label" for="bairro">Bairro</label>
<input class="form-control" id="bairro" type="text" disabled>
</div>
</div>
<div class="col-2">
<div class="mb-3">
<label class="form-label" for="estado">Estado</label>
<input class="form-control" id="estado" type="text" disabled>
</div>
</div>
<div class="col-3">
<div class="mb-3">
<label class="form-label" for="cidade">Cidade</label>
<input class="form-control" id="cidade" type="text" disabled>
<input class="form-control" id="address" name="address" type="hidden">
</div>
</div>
</div>
</div>
<div class="card-footer text-end">
<button class="btn btn-primary" type="submit">Salvar|Atualizar</button>
</div>
</form>
</div>
</div>
</div>
</div>
<div class="modal fade" id="modalTurma" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">Nova Turma</h4>
<button class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">
<form class="form theme-form" action="{{ route('turma.novo') }}" method="POST">
@csrf
<div class="card-body">
<div class="row">
<div class="col">
<div class="mb-3">
<label class="form-label" for="escolas">Escola</label>
<select class="form-select digits" id="escolas" name="id_escola">
@foreach ($escolas as $escola)
<option value="{{ $escola->id }}">{{ $escola->nome }}
</option>
@endforeach
</select>
</div>
</div>
<div class="col">
<div class="mb-3">
<label class="form-label" for="turma_nome">Nome</label>
<input class="form-control" id="turma_nome" name="turma_nome" type="text">
</div>
</div>
<div class="col">
<div class="mb-3">
<label class="form-label" for="turma_descricao">Descrição</label>
<input class="form-control" id="turma_descricao" name="turma_descricao"
type="text">
</div>
</div>
<div class="col">
<div class="mb-3">
<label class="form-label" for="id_whatsapp">Whatsap Id</label>
<input class="form-control" id="id_whatsapp" name="id_whatsapp" type="text">
</div>
</div>
</div>
</div>
<div class="card-footer text-end">
<button class="btn btn-primary" type="submit">Salvar|Atualizar</button>
</div>
</form>
</div>
</div>
</div>
</div>
<div class="modal fade" id="modalAluno" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">Novo Aluno</h4>
<button class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">
<!-- formulário -->
</div>
</div>
</div>
</div>
<div class="modal fade" id="modalEnvio" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<form class="form theme-form" action="{{ route('envio.wpp') }}" method="POST"
enctype="multipart/form-data">
@csrf
<div class="modal-header">
<h4 class="modal-title">Novo Envio</h4>
<button class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">
<div class="row">
<!-- NOVO DROPDOWN (primeiro item) -->
<div class="col-12">
<div class="mb-3">
<label class="form-label">Tipo de Envio</label>
<select class="form-select" name="tipo_envio" id="tipo_envio">
<option value="texto">Somente Texto</option>
<option value="imagem">Imagem + Texto</option>
</select>
</div>
</div>
<!-- Turma -->
<div class="col-12">
<div class="mb-3">
<label class="form-label">Turma</label>
<select class="form-select digits" name="id_turma">
@foreach ($turmas as $turma)
<option value="{{ $turma->id }}">
{{ $turma->nome }}
</option>
@endforeach
</select>
</div>
</div>
<!-- Mensagem -->
<div class="col-12">
<div class="mb-3">
<label class="form-label">Mensagem</label>
<textarea id="editor" name="mensagem" class="form-control"></textarea>
</div>
</div>
<!-- Upload imagem (oculto inicialmente) -->
<div class="col-12 d-none" id="campoImagem">
<div class="mb-3">
<label class="form-label">Imagem</label>
<input type="file" name="imagem" class="form-control"
accept="image/jpeg,image/png,image/webp">
</div>
</div>
</div>
</div>
<div class="modal-footer">
<button class="btn btn-secondary" data-bs-dismiss="modal">
Cancelar
</button>
<button class="btn btn-primary" type="submit">
Enviar Mensagem
</button>
</div>
</form>
</div>
</div>
</div>
<div class="modal fade" id="modalEvento" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">Novo Evento</h4>
<button class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">
<!-- formulário -->
</div>
</div>
</div>
</div>
<!-- latest jquery-->
<script src="../assets/js/jquery-3.5.1.min.js"></script>
<script src="{{ asset('assets/js/jquery-3.5.1.min.js')}}"></script>
<!-- feather icon js-->
<script src="../assets/js/icons/feather-icon/feather.min.js"></script>
<script src="../assets/js/icons/feather-icon/feather-icon.js"></script>
<script src="{{ asset('assets/js/icons/feather-icon/feather.min.js')}}"></script>
<script src="{{ asset('assets/js/icons/feather-icon/feather-icon.js')}}"></script>
<!-- Sidebar jquery-->
<script src="../assets/js/sidebar-menu.js"></script>
<script src="../assets/js/config.js"></script>
<script src="{{ asset('assets/js/sidebar-menu.js')}}"></script>
<script src="{{ asset('assets/js/config.js')}}"></script>
<!-- Bootstrap js-->
<script src="../assets/js/bootstrap/popper.min.js"></script>
<script src="../assets/js/bootstrap/bootstrap.min.js"></script>
<script src="{{ asset('assets/js/bootstrap/popper.min.js')}}"></script>
<script src="{{ asset('assets/js/bootstrap/bootstrap.min.js')}}"></script>
<!-- Plugins JS start-->
<!-- Plugins JS Ends-->
<!-- Theme js-->
<script src="../assets/js/script.js"></script>
<script src="{{ asset('assets/js/script.js')}}"></script>
<!-- login js-->
<!-- Plugin used-->
<script src="{{ asset('assets/js/icons/icons-notify.js') }}"></script>
<script src="{{ asset('assets/js/icons/icon-clipart.js') }}"></script>
<script src="{{ asset('assets/js/icons/feather-icon/feather-icon.js') }}"></script>
<script src="{{ asset('assets/js/icons/feather-icon/feather.min.js') }}"></script>
<script src="{{ asset('assets/js/tooltip-init.js') }}"></script>
<script src="{{ asset('assets/js/dropzone/dropzone.js') }}"></script>
<script src="{{ asset('assets/js/dropzone/dropzone-script.js') }}"></script>
<script src="https://cdn.jsdelivr.net/simplemde/latest/simplemde.min.js"></script>
@yield('scripts')
<script>
let ultimoCNPJ = '';
let timeout = null;
document.getElementById('cnpj').addEventListener('input', function () {
let cnpj = this.value.replace(/\D/g, '');
clearTimeout(timeout);
if (cnpj.length !== 14 || cnpj === ultimoCNPJ) {
return;
}
timeout = setTimeout(() => {
ultimoCNPJ = cnpj;
buscarCNPJ(cnpj);
}, 400);
});
function buscarCNPJ(cnpj) {
fetch(`https://open.cnpja.com/office/${cnpj}`)
.then(response => {
if (!response.ok) {
throw new Error('Erro na consulta');
}
return response.json();
})
.then(data => {
// ===== RAZÃO SOCIAL =====
document.getElementById('razao_social').value =
data.company?.name ?? '';
const address = data.address ?? {};
// ===== ENDEREÇO =====
document.getElementById('logradouro').value = address.street ?? '';
document.getElementById('numero').value = address.number ?? '';
document.getElementById('complemento').value = address.details ?? '';
document.getElementById('bairro').value = address.district ?? '';
document.getElementById('estado').value = address.state ?? '';
document.getElementById('cidade').value = address.city ?? '';
document.getElementById('address').value = JSON.stringify(address ?? {});
// CEP formatado
document.getElementById('cep').value = formatarCEP(address.zip);
})
.catch(error => {
console.error(error);
alert('Erro ao consultar o CNPJ');
});
}
function formatarCEP(cep) {
if (!cep) return '';
return cep.replace(/^(\d{5})(\d{3})$/, '$1-$2');
}
</script>
<script>
var simplemde = new SimpleMDE({
element: document.getElementById("editor"),
spellChecker: false,
toolbar: ["bold", "italic", "strikethrough", "|", "unordered-list", "ordered-list", "|", "preview"]
});
</script>
<script>
document.getElementById('tipo_envio').addEventListener('change', function () {
const campoImagem = document.getElementById('campoImagem');
if (this.value === 'imagem') {
campoImagem.classList.remove('d-none');
} else {
campoImagem.classList.add('d-none');
}
});
</script>
</body>
</html>

View File

@@ -12,7 +12,7 @@
<meta name="author" content="pixelstrap">
<link rel="icon" href="../assets/images/favicon.png" type="image/x-icon">
<link rel="shortcut icon" href="../assets/images/favicon.png" type="image/x-icon">
<title>Escola da Árvore - Administração de comunicação</title>
<title>{{ env('APP_NAME') }} - LOGIN</title>
<!-- Google font-->
<link rel="preconnect" href="https://fonts.gstatic.com">
<link

View File

@@ -1,13 +1,17 @@
<?php
use App\Http\Controllers\AlunosController;
use App\Http\Controllers\EnvioWhatsap;
use App\Http\Controllers\EscolasController;
use App\Http\Controllers\ProfileController;
use App\Http\Controllers\TurmasController;
use Illuminate\Support\Facades\Route;
// Rotas para Guest, sem necessidade de autenticação
Route::middleware('guest')->group(function () {
Route::get('/', function () {
return view('welcome');
return redirect()->route('login');
});
});
@@ -20,6 +24,12 @@ Route::middleware('auth')->group(function () {
Route::get('/dashboard', function () {
return view('dashboard');
})->name('dashboard');
Route::get('/escolas', [EscolasController::class, 'index'])->name('escolas');
Route::post('/escolas', [EscolasController::class, 'createOrUpdate'])->name('escola.novo');
Route::get('/turmas', [TurmasController::class, 'index'])->name('turmas');
Route::post('/turmas', [TurmasController::class, 'createOrUpdate'])->name('turma.novo');
Route::get('/alunos', [AlunosController::class, 'index'])->name('alunos');
Route::post('/envio-wpp', [EnvioWhatsap::class, 'envio'])->name('envio.wpp');
});