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; 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 { .list-group-horizontal {
-webkit-box-orient: horizontal; -webkit-box-orient: horizontal;
-webkit-box-direction: normal; -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"> <meta name="author" content="pixelstrap">
<link rel="icon" href="../assets/images/favicon.png" type="image/x-icon"> <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"> <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--> <!-- Google font-->
<link rel="preconnect" href="https://fonts.gstatic.com"> <link rel="preconnect" href="https://fonts.gstatic.com">
<link <link
@@ -43,17 +43,6 @@
<link id="color" rel="stylesheet" href="../assets/css/color-1.css" media="screen"> <link id="color" rel="stylesheet" href="../assets/css/color-1.css" media="screen">
<!-- Responsive css--> <!-- Responsive css-->
<link rel="stylesheet" type="text/css" href="../assets/css/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> </head>
<body> <body>
@@ -69,14 +58,14 @@
<div class="container-fluid"> <div class="container-fluid">
<div class="row"> <div class="row">
<div class="col-xl-7"><img class="bg-img-cover bg-center" <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> alt="looginpage"></div>
<div class="col-xl-5 p-0"> <div class="col-xl-5 p-0">
<div class="login-card"> <div class="login-card">
<form method="POST" action="{{ route('login') }}" class="theme-form login-form"> <form method="POST" action="{{ route('login') }}" class="theme-form login-form">
@csrf @csrf
<h4>Login</h4> <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"> <div class="form-group">
<label>Email</label> <label>Email</label>
<div class="input-group"><span class="input-group-text"><i class="icon-email"></i></span> <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="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <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="icon" href="{{asset('assets/images/logo3.png')}}" type="image/x-icon">
<link rel="shortcut icon" href="../assets/images/favicon.jpg" type="image/x-icon"> <link rel="shortcut icon" href="{{asset('assets/images/favicon.jpg')}}" type="image/x-icon">
<title>Escola da Árvore - @yield('title')</title> <title>{{ env('APP_NAME') }} - @yield('title')</title>
<!-- Google font--> <!-- Google font-->
<link rel="preconnect" href="https://fonts.gstatic.com"> <link rel="preconnect" href="https://fonts.gstatic.com">
<link <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" 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"> rel="stylesheet">
<!-- Font Awesome--> <!-- 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--> <!-- 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--> <!-- 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--> <!-- 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--> <!-- 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 start-->
<!-- Plugins css Ends--> <!-- Plugins css Ends-->
<!-- Bootstrap css--> <!-- 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--> <!-- App css-->
<link rel="stylesheet" type="text/css" href="../assets/css/style.css"> <link rel="stylesheet" type="text/css" href="{{ asset('assets/css/style.css')}}">
<link id="color" rel="stylesheet" href="../assets/css/color-1.css" media="screen"> <link id="color" rel="stylesheet" href="{{ asset('assets/css/color-1.css')}}" media="screen">
<!-- Responsive css--> <!-- 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> </head>
<body> <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--> <!-- Loader starts-->
<div class="loader-wrapper"> <div class="loader-wrapper">
<div class="theme-loader"> <div class="theme-loader">
@@ -54,10 +71,6 @@
<div class="page-main-header"> <div class="page-main-header">
<div class="main-header-right row m-0"> <div class="main-header-right row m-0">
<div class="main-header-left"> <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" <div class="toggle-sidebar"><i class="status_toggle middle" data-feather="align-center"
id="sidebar-toggle"></i></div> id="sidebar-toggle"></i></div>
</div> </div>
@@ -76,6 +89,26 @@
<ul class="nav-menus"> <ul class="nav-menus">
<li><a class="text-dark" href="#!" onclick="javascript:toggleFullScreen()"><i <li><a class="text-dark" href="#!" onclick="javascript:toggleFullScreen()"><i
data-feather="maximize"></i></a></li> 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"> <li class="onhover-dropdown p-0">
<form method="POST" action="{{ route('logout') }}"> <form method="POST" action="{{ route('logout') }}">
@csrf @csrf
@@ -97,7 +130,7 @@
<header class="main-nav"> <header class="main-nav">
<div class="sidebar-user text-center"><a class="setting-primary" href="javascript:void(0)"><i <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" 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 <div class="badge-bottom"><span class="badge badge-primary">Responsável</span></div><a
href="user-profile.html"> href="user-profile.html">
<h6 class="mt-3 f-14 f-w-600">{{ Auth::user()->name }}</h6> <h6 class="mt-3 f-14 f-w-600">{{ Auth::user()->name }}</h6>
@@ -114,11 +147,25 @@
</li> </li>
<li class="sidebar-main-title"> <li class="sidebar-main-title">
<div> <div>
<h6>Dashboard </h6> <h6>Geral </h6>
</div> </div>
</li> </li>
<li class="dropdown"><a class="nav-link menu-title link-nav" href=""><i <li class="dropdown"><a class="nav-link menu-title link-nav" href=""><i
data-feather="git-pull-request"></i><span>Dashboard</span></a></li> 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> </ul>
</div> </div>
<div class="right-arrow" id="right-arrow"><i data-feather="arrow-right"></i></div> <div class="right-arrow" id="right-arrow"><i data-feather="arrow-right"></i></div>
@@ -148,24 +195,7 @@
</div> </div>
<!-- Container-fluid starts--> <!-- Container-fluid starts-->
<div class="container-fluid"> <div class="container-fluid">
<div class="row"> @yield('content')
<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>
</div> </div>
<!-- Container-fluid Ends--> <!-- Container-fluid Ends-->
</div> </div>
@@ -183,23 +213,355 @@
</footer> </footer>
</div> </div>
</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--> <!-- 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--> <!-- feather icon js-->
<script src="../assets/js/icons/feather-icon/feather.min.js"></script> <script src="{{ asset('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-icon.js')}}"></script>
<!-- Sidebar jquery--> <!-- Sidebar jquery-->
<script src="../assets/js/sidebar-menu.js"></script> <script src="{{ asset('assets/js/sidebar-menu.js')}}"></script>
<script src="../assets/js/config.js"></script> <script src="{{ asset('assets/js/config.js')}}"></script>
<!-- Bootstrap js--> <!-- Bootstrap js-->
<script src="../assets/js/bootstrap/popper.min.js"></script> <script src="{{ asset('assets/js/bootstrap/popper.min.js')}}"></script>
<script src="../assets/js/bootstrap/bootstrap.min.js"></script> <script src="{{ asset('assets/js/bootstrap/bootstrap.min.js')}}"></script>
<!-- Plugins JS start--> <!-- Plugins JS start-->
<!-- Plugins JS Ends--> <!-- Plugins JS Ends-->
<!-- Theme js--> <!-- Theme js-->
<script src="../assets/js/script.js"></script> <script src="{{ asset('assets/js/script.js')}}"></script>
<!-- login js--> <!-- login js-->
<!-- Plugin used--> <!-- 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> </body>
</html> </html>

View File

@@ -12,7 +12,7 @@
<meta name="author" content="pixelstrap"> <meta name="author" content="pixelstrap">
<link rel="icon" href="../assets/images/favicon.png" type="image/x-icon"> <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"> <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--> <!-- Google font-->
<link rel="preconnect" href="https://fonts.gstatic.com"> <link rel="preconnect" href="https://fonts.gstatic.com">
<link <link

View File

@@ -1,13 +1,17 @@
<?php <?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\ProfileController;
use App\Http\Controllers\TurmasController;
use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Route;
// Rotas para Guest, sem necessidade de autenticação // Rotas para Guest, sem necessidade de autenticação
Route::middleware('guest')->group(function () { Route::middleware('guest')->group(function () {
Route::get('/', function () { Route::get('/', function () {
return view('welcome'); return redirect()->route('login');
}); });
}); });
@@ -20,6 +24,12 @@ Route::middleware('auth')->group(function () {
Route::get('/dashboard', function () { Route::get('/dashboard', function () {
return view('dashboard'); return view('dashboard');
})->name('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');
}); });