diff --git a/app/Http/Controllers/EnvioWhatsap.php b/app/Http/Controllers/EnvioWhatsap.php index 80d761b..32e102c 100644 --- a/app/Http/Controllers/EnvioWhatsap.php +++ b/app/Http/Controllers/EnvioWhatsap.php @@ -5,6 +5,7 @@ namespace App\Http\Controllers; use App\Models\turmas; use Illuminate\Http\Request; use Illuminate\Support\Facades\Http; +use App\Jobs\Envio_Mensagem_Whatsapp; class EnvioWhatsap extends Controller { @@ -14,48 +15,17 @@ class EnvioWhatsap extends Controller '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', + 'imagem' => 'required_if:tipo_envio,imagem|image|mimes:jpeg,png,webp|max:8192', ]); - $turma = turmas::findOrFail($request->id_turma); + // 🔥 Apenas coleta os dados brutos + Envio_Mensagem_Whatsapp::dispatch( + $request->id_turma, + $request->tipo_envio, + $request->mensagem, + $request->file('imagem')?->store('tmp') // salva temporariamente + ); - // 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()); + return back()->with('success', 'Envio colocado na fila com sucesso!'); } } diff --git a/app/Http/Controllers/EnviosWppController.php b/app/Http/Controllers/EnviosWppController.php new file mode 100644 index 0000000..c562425 --- /dev/null +++ b/app/Http/Controllers/EnviosWppController.php @@ -0,0 +1,10 @@ +idTurma = $idTurma; + $this->tipoEnvio = $tipoEnvio; + $this->mensagem = $mensagem; + $this->caminhoImagem = $caminhoImagem; + $this->jobUuid = str_replace('-', '', Str::uuid()->toString()); + } + + public function handle(): void + { + $turma = turmas::findOrFail($this->idTurma); + $detalhes = []; + + + // ✅ Corrigir formatação WhatsApp + $mensagem = $this->mensagem ?? ''; + $mensagem = str_replace(['**', '__', '~~'], ['*', '_', '~'], $mensagem); + + if ($this->tipoEnvio === 'imagem' && $this->caminhoImagem) { + + $conteudo = Storage::get($this->caminhoImagem); + $mime = Storage::mimeType($this->caminhoImagem); + + $base64 = base64_encode($conteudo); + $imagem = "data:$mime;base64,$base64"; + + // 🧹 Remove arquivo temporário + Storage::delete($this->caminhoImagem); + $existeImagem = true; + } else { + $existeImagem = false; + } + + + $detalhes['etapas'][] = [ + 'tipo de evento' => $this->tipoEnvio, + 'data' => now()->format('d-m-Y H:i:s'), + 'mensagem' => $mensagem, + 'imagem' => $existeImagem, + ]; + try { + envios_wpp::updateOrCreate(['id_job' => $this->jobUuid], [ + 'id_job' => $this->jobUuid, + 'status' => 'Em andamento', + 'id_turma' => $this->idTurma, + 'detalhes' => [ + 'tipo_de_evento' => $this->tipoEnvio, + 'mensagem' => $detalhes, + ] + ]); + } catch (\Throwable $th) { + Log::error('Erro, segue: ', [ + 'erro' => $th->getMessage() + ]); + + envios_wpp::updateOrCreate(['id_job' => $this->jobUuid], [ + 'id_job' => $this->jobUuid, + 'status' => 'Erro', + 'id_turma' => $this->idTurma, + 'detalhes' => [ + 'tipo_de_evento' => $this->tipoEnvio, + 'mensagem' => $detalhes, + 'Erro: ' => $th->getMessage(), + ] + ]); + } + + switch ($this->tipoEnvio) { + case 'texto': + $response = Http::withHeaders([ + 'accept' => 'application/json', + 'token' => '3aCSVE4jS9h233mNBr1awz3DF0In8CFk', + ]) + ->post('https://waha.cae.app.br/chat/send/text', [ + 'phone' => $turma->id_whatsapp, + 'body' => $mensagem, + ]); + + if ($response->json()['code'] == 200) { + + $detalhes['etapas'][] = [ + 'tipo de evento' => $this->tipoEnvio, + 'data' => now()->format('d-m-Y H:i:s'), + 'mensagem' => 'Mensagem enviada com sucessl' + ]; + try { + envios_wpp::updateOrCreate(['id_job' => $this->jobUuid], [ + 'id_job' => $this->jobUuid, + 'status' => 'Concluido', + 'id_turma' => $this->idTurma, + 'detalhes' => [ + 'tipo_de_evento' => $this->tipoEnvio, + 'mensagem' => $detalhes, + ] + ]); + } catch (\Throwable $th) { + Log::error('Erro, segue: ', [ + 'erro' => $th->getMessage() + ]); + + envios_wpp::updateOrCreate(['id_job' => $this->jobUuid], [ + 'id_job' => $this->jobUuid, + 'status' => 'Erro', + 'id_turma' => $this->idTurma, + 'detalhes' => [ + 'tipo_de_evento' => $this->tipoEnvio, + 'data' => now()->format('d-m-Y H:i:s'), + 'Erro: ' => $th->getMessage(), + ] + ]); + } + } else { + $detalhes['etapas'][] = [ + 'tipo de evento' => $this->tipoEnvio, + 'data' => now()->format('d-m-Y H:i:s'), + 'mensagem' => 'Mensagem não enviada' + ]; + try { + envios_wpp::updateOrCreate(['id_job' => $this->jobUuid], [ + 'id_job' => $this->jobUuid, + 'status' => 'Erro', + 'id_turma' => $this->idTurma, + 'detalhes' => [ + 'tipo_de_evento' => $this->tipoEnvio, + 'mensagem' => $detalhes, + ] + ]); + } catch (\Throwable $th) { + Log::error('Erro, segue: ', [ + 'erro' => $th->getMessage() + ]); + + envios_wpp::updateOrCreate(['id_job' => $this->jobUuid], [ + 'id_job' => $this->jobUuid, + 'status' => 'Erro', + 'id_turma' => $this->idTurma, + 'detalhes' => [ + 'tipo_de_evento' => $this->tipoEnvio, + 'data' => now()->format('d-m-Y H:i:s'), + 'Erro: ' => $th->getMessage(), + ] + ]); + } + } + break; + + case 'imagem'; + $response = Http::withHeaders([ + 'accept' => 'application/json', + 'token' => '3aCSVE4jS9h233mNBr1awz3DF0In8CFk', + ]) + ->post('https://waha.cae.app.br/chat/send/image', [ + 'phone' => $turma->id_whatsapp, + 'caption' => $mensagem, + 'image' => $imagem, + ]); + if ($response->json()['code'] == 200) { + + $detalhes['etapas'][] = [ + 'tipo de evento' => $this->tipoEnvio, + 'data' => now()->format('d-m-Y H:i:s'), + 'mensagem' => 'Mensagem enviada com sucessl' + ]; + try { + envios_wpp::updateOrCreate(['id_job' => $this->jobUuid], [ + 'id_job' => $this->jobUuid, + 'status' => 'Concluido', + 'id_turma' => $this->idTurma, + 'detalhes' => [ + 'tipo_de_evento' => $this->tipoEnvio, + 'mensagem' => $detalhes, + ] + ]); + } catch (\Throwable $th) { + Log::error('Erro, segue: ', [ + 'erro' => $th->getMessage() + ]); + + envios_wpp::updateOrCreate(['id_job' => $this->jobUuid], [ + 'id_job' => $this->jobUuid, + 'status' => 'Erro', + 'id_turma' => $this->idTurma, + 'detalhes' => [ + 'tipo_de_evento' => $this->tipoEnvio, + 'data' => now()->format('d-m-Y H:i:s'), + 'Erro: ' => $th->getMessage(), + ] + ]); + } + } else { + $detalhes['etapas'][] = [ + 'tipo de evento' => $this->tipoEnvio, + 'data' => now()->format('d-m-Y H:i:s'), + 'mensagem' => 'Mensagem não enviada' + ]; + try { + envios_wpp::updateOrCreate(['id_job' => $this->jobUuid], [ + 'id_job' => $this->jobUuid, + 'status' => 'Erro', + 'id_turma' => $this->idTurma, + 'detalhes' => [ + 'tipo_de_evento' => $this->tipoEnvio, + 'mensagem' => $detalhes, + ] + ]); + } catch (\Throwable $th) { + Log::error('Erro, segue: ', [ + 'erro' => $th->getMessage() + ]); + + envios_wpp::updateOrCreate(['id_job' => $this->jobUuid], [ + 'id_job' => $this->jobUuid, + 'status' => 'Erro', + 'id_turma' => $this->idTurma, + 'detalhes' => [ + 'tipo_de_evento' => $this->tipoEnvio, + 'data' => now()->format('d-m-Y H:i:s'), + 'Erro: ' => $th->getMessage(), + ] + ]); + } + } + break; + + default: + # code... + break; + } + } + + public function tags() + { + return [ + 'turma: ' . $this->idTurma, + 'tipo: ' . $this->tipoEnvio, + 'jobId: ' . $this->jobUuid, + ]; + } + +} \ No newline at end of file diff --git a/app/Models/envios_wpp.php b/app/Models/envios_wpp.php new file mode 100644 index 0000000..e938414 --- /dev/null +++ b/app/Models/envios_wpp.php @@ -0,0 +1,20 @@ + 'array', + ]; +} diff --git a/app/Models/turmas.php b/app/Models/turmas.php index 1ae4da0..efc3216 100644 --- a/app/Models/turmas.php +++ b/app/Models/turmas.php @@ -19,4 +19,8 @@ class turmas extends Model { return $this->hasMany(alunos::class, 'id', 'id_turma'); } + + public function enviosWpp() { + return $this->hasMany(envios_wpp::class, 'id_turma', 'id'); + } } diff --git a/app/Providers/HorizonServiceProvider.php b/app/Providers/HorizonServiceProvider.php new file mode 100644 index 0000000..59599dc --- /dev/null +++ b/app/Providers/HorizonServiceProvider.php @@ -0,0 +1,36 @@ +email, [ + // + ]); + }); + } +} diff --git a/bootstrap/providers.php b/bootstrap/providers.php index 38b258d..4e3b440 100755 --- a/bootstrap/providers.php +++ b/bootstrap/providers.php @@ -2,4 +2,5 @@ return [ App\Providers\AppServiceProvider::class, + App\Providers\HorizonServiceProvider::class, ]; diff --git a/composer.json b/composer.json index 409a407..48e5c8b 100755 --- a/composer.json +++ b/composer.json @@ -9,6 +9,7 @@ "php": "^8.2", "laravel/breeze": "^2.3", "laravel/framework": "^12.0", + "laravel/horizon": "^5.44", "laravel/tinker": "^2.10.1" }, "require-dev": { diff --git a/composer.lock b/composer.lock index 9fc4211..7a91734 100755 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "5932c2eb38775299ed7dde1304f360d8", + "content-hash": "9898179818d19ab28a9c001b5b54d46e", "packages": [ { "name": "brick/math", @@ -1335,6 +1335,85 @@ }, "time": "2026-02-04T18:34:13+00:00" }, + { + "name": "laravel/horizon", + "version": "v5.44.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/horizon.git", + "reference": "00c21e4e768112cce3f4fe576d75956dfc423de2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/horizon/zipball/00c21e4e768112cce3f4fe576d75956dfc423de2", + "reference": "00c21e4e768112cce3f4fe576d75956dfc423de2", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-pcntl": "*", + "ext-posix": "*", + "illuminate/contracts": "^9.21|^10.0|^11.0|^12.0|^13.0", + "illuminate/queue": "^9.21|^10.0|^11.0|^12.0|^13.0", + "illuminate/support": "^9.21|^10.0|^11.0|^12.0|^13.0", + "nesbot/carbon": "^2.17|^3.0", + "php": "^8.0", + "ramsey/uuid": "^4.0", + "symfony/console": "^6.0|^7.0|^8.0", + "symfony/error-handler": "^6.0|^7.0|^8.0", + "symfony/polyfill-php83": "^1.28", + "symfony/process": "^6.0|^7.0|^8.0" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "orchestra/testbench": "^7.55|^8.36|^9.15|^10.8|^11.0", + "phpstan/phpstan": "^1.10|^2.0", + "predis/predis": "^1.1|^2.0|^3.0" + }, + "suggest": { + "ext-redis": "Required to use the Redis PHP driver.", + "predis/predis": "Required when not using the Redis PHP driver (^1.1|^2.0|^3.0)." + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "Horizon": "Laravel\\Horizon\\Horizon" + }, + "providers": [ + "Laravel\\Horizon\\HorizonServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "6.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\Horizon\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Dashboard and code-driven configuration for Laravel queues.", + "keywords": [ + "laravel", + "queue" + ], + "support": { + "issues": "https://github.com/laravel/horizon/issues", + "source": "https://github.com/laravel/horizon/tree/v5.44.0" + }, + "time": "2026-02-10T18:18:08+00:00" + }, { "name": "laravel/prompts", "version": "v0.3.12", diff --git a/config/horizon.php b/config/horizon.php new file mode 100644 index 0000000..32f8f0d --- /dev/null +++ b/config/horizon.php @@ -0,0 +1,254 @@ + env('HORIZON_NAME'), + + /* + |-------------------------------------------------------------------------- + | Horizon Domain + |-------------------------------------------------------------------------- + | + | This is the subdomain where Horizon will be accessible from. If this + | setting is null, Horizon will reside under the same domain as the + | application. Otherwise, this value will serve as the subdomain. + | + */ + + 'domain' => env('HORIZON_DOMAIN'), + + /* + |-------------------------------------------------------------------------- + | Horizon Path + |-------------------------------------------------------------------------- + | + | This is the URI path where Horizon will be accessible from. Feel free + | to change this path to anything you like. Note that the URI will not + | affect the paths of its internal API that aren't exposed to users. + | + */ + + 'path' => env('HORIZON_PATH', 'horizon'), + + /* + |-------------------------------------------------------------------------- + | Horizon Redis Connection + |-------------------------------------------------------------------------- + | + | This is the name of the Redis connection where Horizon will store the + | meta information required for it to function. It includes the list + | of supervisors, failed jobs, job metrics, and other information. + | + */ + + 'use' => 'default', + + /* + |-------------------------------------------------------------------------- + | Horizon Redis Prefix + |-------------------------------------------------------------------------- + | + | This prefix will be used when storing all Horizon data in Redis. You + | may modify the prefix when you are running multiple installations + | of Horizon on the same server so that they don't have problems. + | + */ + + 'prefix' => env( + 'HORIZON_PREFIX', + Str::slug(env('APP_NAME', 'laravel'), '_').'_horizon:' + ), + + /* + |-------------------------------------------------------------------------- + | Horizon Route Middleware + |-------------------------------------------------------------------------- + | + | These middleware will get attached onto each Horizon route, giving you + | the chance to add your own middleware to this list or change any of + | the existing middleware. Or, you can simply stick with this list. + | + */ + + 'middleware' => ['web'], + + /* + |-------------------------------------------------------------------------- + | Queue Wait Time Thresholds + |-------------------------------------------------------------------------- + | + | This option allows you to configure when the LongWaitDetected event + | will be fired. Every connection / queue combination may have its + | own, unique threshold (in seconds) before this event is fired. + | + */ + + 'waits' => [ + 'redis:default' => 60, + ], + + /* + |-------------------------------------------------------------------------- + | Job Trimming Times + |-------------------------------------------------------------------------- + | + | Here you can configure for how long (in minutes) you desire Horizon to + | persist the recent and failed jobs. Typically, recent jobs are kept + | for one hour while all failed jobs are stored for an entire week. + | + */ + + 'trim' => [ + 'recent' => 60, + 'pending' => 60, + 'completed' => 60, + 'recent_failed' => 10080, + 'failed' => 10080, + 'monitored' => 10080, + ], + + /* + |-------------------------------------------------------------------------- + | Silenced Jobs + |-------------------------------------------------------------------------- + | + | Silencing a job will instruct Horizon to not place the job in the list + | of completed jobs within the Horizon dashboard. This setting may be + | used to fully remove any noisy jobs from the completed jobs list. + | + */ + + 'silenced' => [ + // App\Jobs\ExampleJob::class, + ], + + 'silenced_tags' => [ + // 'notifications', + ], + + /* + |-------------------------------------------------------------------------- + | Metrics + |-------------------------------------------------------------------------- + | + | Here you can configure how many snapshots should be kept to display in + | the metrics graph. This will get used in combination with Horizon's + | `horizon:snapshot` schedule to define how long to retain metrics. + | + */ + + 'metrics' => [ + 'trim_snapshots' => [ + 'job' => 24, + 'queue' => 24, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Fast Termination + |-------------------------------------------------------------------------- + | + | When this option is enabled, Horizon's "terminate" command will not + | wait on all of the workers to terminate unless the --wait option + | is provided. Fast termination can shorten deployment delay by + | allowing a new instance of Horizon to start while the last + | instance will continue to terminate each of its workers. + | + */ + + 'fast_termination' => false, + + /* + |-------------------------------------------------------------------------- + | Memory Limit (MB) + |-------------------------------------------------------------------------- + | + | This value describes the maximum amount of memory the Horizon master + | supervisor may consume before it is terminated and restarted. For + | configuring these limits on your workers, see the next section. + | + */ + + 'memory_limit' => 64, + + /* + |-------------------------------------------------------------------------- + | Queue Worker Configuration + |-------------------------------------------------------------------------- + | + | Here you may define the queue worker settings used by your application + | in all environments. These supervisors and settings handle all your + | queued jobs and will be provisioned by Horizon during deployment. + | + */ + + 'defaults' => [ + 'supervisor-1' => [ + 'connection' => 'redis', + 'queue' => ['default'], + 'balance' => 'auto', + 'autoScalingStrategy' => 'time', + 'maxProcesses' => 1, + 'maxTime' => 0, + 'maxJobs' => 0, + 'memory' => 128, + 'tries' => 1, + 'timeout' => 60, + 'nice' => 0, + ], + ], + + 'environments' => [ + 'production' => [ + 'supervisor-1' => [ + 'maxProcesses' => 10, + 'balanceMaxShift' => 1, + 'balanceCooldown' => 3, + ], + ], + + 'local' => [ + 'supervisor-1' => [ + 'maxProcesses' => 3, + ], + ], + ], + + /* + |-------------------------------------------------------------------------- + | File Watcher Configuration + |-------------------------------------------------------------------------- + | + | The following list of directories and files will be watched when using + | the `horizon:listen` command. Whenever any directories or files are + | changed, Horizon will automatically restart to apply all changes. + | + */ + + 'watch' => [ + 'app', + 'bootstrap', + 'config/**/*.php', + 'database/**/*.php', + 'public/**/*.php', + 'resources/**/*.php', + 'routes', + 'composer.lock', + 'composer.json', + '.env', + ], +]; diff --git a/database/migrations/2026_02_13_144218_create_envios_wpps_table.php b/database/migrations/2026_02_13_144218_create_envios_wpps_table.php new file mode 100644 index 0000000..6d39f2e --- /dev/null +++ b/database/migrations/2026_02_13_144218_create_envios_wpps_table.php @@ -0,0 +1,30 @@ +id(); + $table->integer('id_turma'); + $table->string('status'); + $table->json('detalhes'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('envios_wpps'); + } +}; diff --git a/database/migrations/2026_02_13_155457_add_id_jopb_to_envios_wpp.php b/database/migrations/2026_02_13_155457_add_id_jopb_to_envios_wpp.php new file mode 100644 index 0000000..ba32eb5 --- /dev/null +++ b/database/migrations/2026_02_13_155457_add_id_jopb_to_envios_wpp.php @@ -0,0 +1,28 @@ +string('id_job')->after('id_turma'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('envios_wpp', function (Blueprint $table) { + // + }); + } +}; diff --git a/dump.rdb b/dump.rdb index 4c3caba..f240cf8 100644 Binary files a/dump.rdb and b/dump.rdb differ diff --git a/resources/views/escolas/turmas.blade.php b/resources/views/escolas/turmas.blade.php index 1ce1325..6913b7a 100644 --- a/resources/views/escolas/turmas.blade.php +++ b/resources/views/escolas/turmas.blade.php @@ -25,7 +25,7 @@ @foreach ($turmas as $turma) - {{ $turma->id }} + {{ $turma->id }} {{ $turma->escola->nome }} {{ $turma->nome }} {{ $turma->descricao }} diff --git a/resources/views/escolas/turmas_detalhes.blade.php b/resources/views/escolas/turmas_detalhes.blade.php new file mode 100644 index 0000000..08ad9b9 --- /dev/null +++ b/resources/views/escolas/turmas_detalhes.blade.php @@ -0,0 +1,1029 @@ +@extends('theme.default') +@section('title', $turma->escola->nome) +@section('title.page', $turma->escola->nome) +@section('title.page1', 'CAE') +@section('title.page2', $turma->escola->nome) +@section('title.page3', $turma->nome) +@section('content') +
+
+
+
+
+
+
+
+
    +
  • +
    +
  • +
  • +
  • +
  • +
  • +
  • +
+
+
+
+
+

Wellcome Back, John!!

+

Welcome to the viho Family! we are glad that you are visite this dashboard. we will be happy to help you grow your business.

+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
                                     <div class="card profile-greeting"> 
+  <div class="card-header">
+    <div class="header-top">
+      <div class="setting-list bg-primary">
+        <ul class="list-unstyled setting-option">
+          <li><div class="setting-white"><i class="icon-settings"></i></div></li>
+          <li><i class="view-html fa fa-code font-white"></i></li>
+          <li><i class="icofont icofont-maximize full-card font-white"></i></li>
+          <li><i class="icofont icofont-minus minimize-card font-white"></i></li>
+          <li><i class="icofont icofont-refresh reload-card font-white"></i></li>
+          <li><i class="icofont icofont-error close-card font-white"> </i></li>
+        </ul>
+      </div>
+    </div>
+  </div>
+  <div class="card-body text-center">
+    <h3 class="font-light">Wellcome Back, John!!</h3>
+    <p>Lorem ipsum is simply dummy text of the printing and typesetting industry.Lorem ipsum has been</p>
+    <button class="btn btn-light">Update </button>
+  </div>
+</div>
+
+
+
+
+
+
+
+
+ + + + + + + + + + + + +
+
8,50,49
+

Our Annual Income

95.54% +
+ + + + + + + + + + + + +
+
+
+
+
+
+
+
+ + + + + + + +
+
2,03,59
+

our Annual losses

90.54% +
+ + + + + + + +
+
+
+
+
+
+
+
+
+
+
Sales overview
+
+

$859.25k86% More than last year

+
+
+
    +
  • +
    +
  • +
  • +
  • +
  • +
  • +
  • +
+
+
+
+
+
+
+ +
<div class="card income-card"> 
+  <div class="card-header">
+    <div class="header-top d-sm-flex align-items-center">
+      <h5> yearly overview  </h5>
+       <div class="center-content" >
+         <p> 
+           <span class="font-primary fontbold-600" > $859.25k </span>
+           <i class="toprightarrow-primary fa fa-arrow-up m-l-10 m-r-10" > </i>
+            86% More than last year
+         </p> 
+      </div>
+      <div class="setting-list">
+        <ul class="list-unstyled setting-option">
+          <li><div class="setting-primary"><i class="icon-settings"></i></div></li>
+          <li><i class="view-html fa fa-code font-primary"></i></li>
+          <li><i class="icofont icofont-maximize full-card font-primary"></i></li>
+          <li><i class="icofont icofont-minus minimize-card font-primary"></i></li>
+          <li><i class="icofont icofont-refresh reload-card font-primary"></i></li>
+          <li><i class="icofont icofont-error close-card font-primary"> </i></li>
+        </ul>
+      </div>
+    </div>
+  </div>
+  <div class="card-body p-0">
+    <div id="chart-timeline-dashbord"></div>
+  </div>
+</div>
+
+
+
+
+
+
+
+
+
+
+
Growth Overview
+
+

80% Growth

+
+
+
    +
  • +
    +
  • +
  • +
  • +
  • +
  • +
  • +
+
+
+
+
+
+
+ +
                                     <div class="card"> 
+  <div class="card-header">
+    <div class="header-top d-sm-flex align-items-center">
+      <h5> Sell Overview </h5>
+       <div class="center-content" >
+         <p class="d-flex align-items-center">                                        
+           <i class="toprightarrow-primary fa fa-arrow-up me-2" > </i>
+            86% Growth
+         </p> 
+      </div>
+      <div class="setting-list">
+        <ul class="list-unstyled setting-option">
+          <li><div class="setting-primary"><i class="icon-settings"></i></div></li>
+          <li><i class="view-html fa fa-code font-primary"></i></li>
+          <li><i class="icofont icofont-maximize full-card font-primary"></i></li>
+          <li><i class="icofont icofont-minus minimize-card font-primary"></i></li>
+          <li><i class="icofont icofont-refresh reload-card font-primary"></i></li>
+          <li><i class="icofont icofont-error close-card font-primary"> </i></li>
+        </ul>
+      </div>
+    </div>
+  </div>
+  <div class="card-body p-0">
+    <div id="chart-dashbord"></div>                                       
+  </div>
+</div>
+
+
+
+
+
+
+
+
+
Latest activity
+
+
    +
  • Today
  • +
  • Month
  • +
+
+
+
    +
  • +
    +
  • +
  • +
  • +
  • +
  • +
  • +
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
Google project Apply Review +

Complete in 3 Hours

+
+
+
EditDelete
+
+ + + +
Business Logo Create +

Complete in 2 Days

+
+
+
EditDelete
+
+ + + + + + + + + + + + + + + +
Business Project Research +

Due in 1 hour

+
+
+
EditDelete
+
+ + + + + + + + + + + + + +
Recruitment in IT Depertment +

Complete in 3 Hours

+
+
+
EditDelete
+
+ + + + + + + + + + + + +
Submit Riverfront Project +

Complete in 2 Days

+
+
+
EditDelete
+
+
+ +
                                     <div class="card latest-update-sec"> 
+  <div class="card-header">
+    <div class="header-top d-sm-flex align-items-center">
+      <h5> Latest Update </h5>
+       <div class="center-content" >
+         <ul class="week-date" >
+             <li class="font-primary"> Today </li>
+             <li > Month </li>
+          </ul> 
+      </div>
+      <div class="setting-list">
+        <ul class="list-unstyled setting-option">
+          <li><div class="setting-primary"><i class="icon-settings"></i></div></li>
+          <li><i class="view-html fa fa-code font-primary"></i></li>
+          <li><i class="icofont icofont-maximize full-card font-primary"></i></li>
+          <li><i class="icofont icofont-minus minimize-card font-primary"></i></li>
+          <li><i class="icofont icofont-refresh reload-card font-primary"></i></li>
+          <li><i class="icofont icofont-error close-card font-primary"> </i></li>
+        </ul>
+      </div>
+    </div>
+  </div>
+  <div class="card-body px-0">
+    <div class="table-responsive">
+        <table class="table table-bordernone">
+            <tbody>
+              <tr>
+                <td>
+                      <div class="media">
+                           <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewbox="0 0 512.001 512.001" style="enable-background:new 0 0 512.001 512.001;" xml:space="preserve">
+                             <g>
+                               <g>
+                                 <path d="M506.35,80.699c-7.57-7.589-19.834-7.609-27.43-0.052L331.662,227.31l-42.557-42.557c-7.577-7.57-19.846-7.577-27.423,0 L89.076,357.36c-7.577,7.57-7.577,19.853,0,27.423c3.782,3.788,8.747,5.682,13.712,5.682c4.958,0,9.93-1.894,13.711-5.682 l158.895-158.888l42.531,42.524c7.57,7.57,19.808,7.577,27.397,0.032l160.97-160.323 C513.881,100.571,513.907,88.288,506.35,80.699z"></path>
+                                </g>
+                             </g>
+                             <g>
+                               <g>
+                                 <path d="M491.96,449.94H38.788V42.667c0-10.712-8.682-19.394-19.394-19.394S0,31.955,0,42.667v426.667 c0,10.712,8.682,19.394,19.394,19.394H491.96c10.712,0,19.394-8.682,19.394-19.394C511.354,458.622,502.672,449.94,491.96,449.94z "></path>
+                               </g>
+                             </g>
+                             <g>
+                               <g>
+                                 <path d="M492.606,74.344H347.152c-10.712,0-19.394,8.682-19.394,19.394s8.682,19.394,19.394,19.394h126.061v126.067 c0,10.705,8.682,19.394,19.394,19.394S512,249.904,512,239.192V93.738C512,83.026,503.318,74.344,492.606,74.344z"></path>
+                               </g>
+                             </g>
+                           </svg>
+                        <div class="media-body">
+                            <span> Google project Apply Review</span>
+                            <p> Complete in 3 Hours</p>
+                        </div>
+                      </div>
+                </td>
+                <td>
+                  <a href='index.html' target='_blank'> Edit
+                  </a>
+                </td>
+                <td>
+                  <a href='index.html' target='_blank'> Detete
+                  </a>
+                </td>
+              </tr>
+              <tr>
+                <td>
+                      <div class="media">
+                          <svg enable-background="new 0 0 512 512" viewbox="0 0 512 512" xmlns="http://www.w3.org/2000/svg">
+                               <path d="m362 91v-60h-212v60h-150v390h512c0-16.889 0-372.29 0-390zm-182-30h152v30h-152zm302 390h-452v-202.844l90 36v46.844h90v-30h92v30h90v-46.844l90-36zm-302-150h-30v-60h30zm152-60h30v60h-30c0-7.259 0-52.693 0-60zm150-25.156-90 36v-40.844h-90v60h-92v-60h-90v40.844l-90-36c0-14.163 0-84.634 0-94.844h452z"></path>
+                           </svg>
+                        <div class="media-body">
+                            <span> Business Logo Create</span>
+                            <p> Complete in 2 Days</p>
+                        </div>
+                      </div>
+                </td>
+                <td>
+                  <a href='index.html' target='_blank'> Edit
+                  </a>
+                </td>
+                <td>
+                  <a href='index.html' target='_blank'> Detete
+                  </a>
+                </td>
+              </tr>
+              <tr>
+                <td>
+                      <div class="media">
+                          <svg enable-background="new 0 0 512 512" viewbox="0 0 512 512" xmlns="http://www.w3.org/2000/svg">
+                               <g>
+                                 <path d="m345.622 126.038c-50.748-45.076-130.482-46.914-183.244 3.903-21.262 20.478-35.375 47.381-39.737 75.754-5.454 35.471 2.872 70.834 23.444 99.576 56.271 78.616 49.132 141.058 49.915 145.691 0 16.435 6.211 31.795 17.491 43.253 11.289 11.469 26.386 17.785 42.509 17.785 33.084 0 60-26.916 60-60 .686-4.269-6.11-72.81 47.676-143.691 17.875-23.557 27.324-51.673 27.324-81.309 0-38.547-16.54-75.347-45.378-100.962zm-89.622 355.962c-16.486 0-29.462-13.096-29.975-30h59.975c0 16.542-13.458 30-30 30zm83.777-191.826c-30.015 39.554-47.946 84.707-52.569 131.826h-62.57c-4.961-45.331-23.43-91.26-54.157-134.19-15.985-22.333-22.444-49.876-18.188-77.556 7.293-47.43 49.733-88.262 103.846-88.262 58.661 0 104.861 47.891 104.861 105.008 0 23.032-7.339 44.877-21.223 63.174z"></path>
<path d="m256 62c8.284 0 15-6.716 15-15v-32c0-8.284-6.716-15-15-15s-15 6.716-15 15v32c0 8.284 6.716 15 15 15z"></path>
<path d="m419.385 149.99 25.98-15c7.174-4.142 9.632-13.316 5.49-20.49-4.142-7.175-13.316-9.633-20.49-5.49l-25.98 15c-7.174 4.142-9.632 13.316-5.49 20.49 4.162 7.21 13.349 9.613 20.49 5.49z"></path>
<path d="m92.615 304.01-25.98 15c-7.174 4.142-9.632 13.316-5.49 20.49 4.163 7.21 13.35 9.613 20.49 5.49l25.98-15c7.174-4.142 9.632-13.316 5.49-20.49-4.141-7.175-13.316-9.632-20.49-5.49z"></path>
<path d="m338.5 84.105c7.141 4.124 16.33 1.716 20.49-5.49l15-25.98c4.142-7.174 1.684-16.348-5.49-20.49-7.174-4.144-16.349-1.685-20.49 5.49l-15 25.98c-4.142 7.175-1.684 16.348 5.49 20.49z"></path>
<path d="m153.01 78.615c4.163 7.21 13.35 9.613 20.49 5.49 7.174-4.142 9.632-13.316 5.49-20.49l-15-25.98c-4.142-7.174-13.315-9.633-20.49-5.49-7.174 4.142-9.632 13.316-5.49 20.49z"></path>
<path d="m445.365 319.01-25.98-15c-7.175-4.143-16.349-1.684-20.49 5.49-4.142 7.174-1.684 16.348 5.49 20.49l25.98 15c7.141 4.124 16.33 1.716 20.49-5.49 4.143-7.174 1.685-16.348-5.49-20.49z"></path>
<path d="m107.615 124.01-25.98-15c-7.175-4.144-16.348-1.684-20.49 5.49s-1.684 16.348 5.49 20.49l25.98 15c7.141 4.124 16.33 1.716 20.49-5.49 4.143-7.174 1.685-16.348-5.49-20.49z"></path>
<path d="m466 212h-30c-8.284 0-15 6.716-15 15s6.716 15 15 15h30c8.284 0 15-6.716 15-15s-6.716-15-15-15z"></path>
<path d="m91 227c0-8.284-6.716-15-15-15h-30c-8.284 0-15 6.716-15 15s6.716 15 15 15h30c8.284 0 15-6.716 15-15z"></path>
<path d="m275.394 216.394-19.394 19.393-19.394-19.393c-5.857-5.858-15.355-5.858-21.213 0s-5.858 15.355 0 21.213l25.607 25.606v53.787c0 8.284 6.716 15 15 15s15-6.716 15-15v-53.787l25.606-25.606c5.858-5.858 5.858-15.355 0-21.213-5.857-5.859-15.355-5.859-21.212 0z"></path> + </g> + </svg> + <div class="media-body"> + <span> Business Project Research</span> + <p> Due in 1 hour</p> + </div> + </div> + </td> + <td> + <a href='index.html' target='_blank'> Edit + </a> + </td> + <td> + <a href='index.html' target='_blank'> Detete + </a> + </td> + </tr> + <tr> + <td> + <div class="media"> + <svg enable-background="new 0 0 512 512" viewbox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"> + <g> + <path d="m512 390v-390h-512v390h241v32h-15c-41.355 0-75 33.645-75 75v15h210v-15c0-41.355-33.645-75-75-75h-15v-32zm-226 62c19.556 0 36.239 12.539 42.43 30h-144.86c6.191-17.461 22.874-30 42.43-30zm-256-92v-330h452v330c-12.164 0-438.947 0-452 0z"></path> + <path d="m136 180c24.813 0 45-20.187 45-45s-20.187-45-45-45-45 20.187-45 45 20.187 45 45 45zm0-60c8.271 0 15 6.729 15 15s-6.729 15-15 15-15-6.729-15-15 6.729-15 15-15z"></path>
<path d="m184.568 197.848c-28.678-24.39-60.953-16.827-61.054-16.833-35.639 5.799-62.514 38.985-62.514 77.196v41.789h150v-45c0-22.034-9.634-42.865-26.432-57.152zm-3.568 72.152h-90v-11.789c0-23.666 16.049-44.122 37.332-47.584 13.509-2.198 26.578 1.38 36.801 10.074 10.083 8.577 15.867 21.078 15.867 34.299z"></path> + <path d="m241 270h120v30h-120z"></path> + <path d="m241 210h210v30h-210z"></path> + <path d="m241 150h210v30h-210z"></path> + <path d="m331 90h120v30h-120z"></path> + <path d="m241 90h60v30h-60z"></path> + <path d="m391 270h60v30h-60z"></path> + </g> + </svg> + <div class="media-body"> + <span> Recruitment in IT Depertment</span> + <p> Complete in 3 Hours</p> + </div> + </div> + </td> + <td> + <a href='index.html' target='_blank'> Edit + </a> + </td> + <td> + <a href='index.html' target='_blank'> Detete + </a> + </td> + </tr> + <tr> + <td> + <div class="media"> + <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewbox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve"> + <g> + <g> + <path d="M256,0C114.848,0,0,114.848,0,256s114.848,256,256,256s256-114.848,256-256S397.152,0,256,0z M256,480 C132.48,480,32,379.52,32,256S132.48,32,256,32s224,100.48,224,224S379.52,480,256,480z"></path> + </g> + </g> + <g> + <g> + <path d="M340.688,292.688L272,361.376V96h-32v265.376l-68.688-68.688l-22.624,22.624l96,96c3.12,3.12,7.216,4.688,11.312,4.688 s8.192-1.568,11.312-4.688l96-96L340.688,292.688z"></path> + </g> + </g> + </svg> + <div class="media-body"> + <span> Submit Riverfront Project</span> + <p> Complete in 2 Days</p> + </div> + </div> + </td> + <td> + <a href='index.html' target='_blank'> Edit + </a> + </td> + <td> + <a href='index.html' target='_blank'> Detete + </a> + </td> + </tr> + </tbody> + </table> + </div> + </div> +</div>
+
+
+
+
+
+
+
+
+
Recent Orders
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDateQuantityValueRate +
+
    +
  • +
    +
  • +
  • +
  • +
  • +
  • +
  • +
+
+
+ + +

16 August

+
+

54146

+
+

$210326

+
+

Done

+
+ + +

2 October

+
+

32015

+
+

$548526

+
+

Done

+
+ + +

21 March

+
+

12548

+
+

$589565

+
+

Done

+
+ + +

31 December

+
+

15495

+
+

$125424

+
+

Done

+
+ + +

26 January

+
+

56625

+
+

$112103

+
+

Done

+
+
+
+ +
<div class="card">
+ <div class="card-body">
+   <div class="table-responsive">
+     <table class="table table-bordernone">
+       <thead>
+         <tr>
+           <th>Name</th>
+           <th>Date</th>
+           <th>Quantity</th>
+           <th>Value</th>
+           <th>Rate</th>
+           <th>
+             <div class="setting-list">
+               <ul class="list-unstyled setting-option">
+                 <li>
+                   <div class="setting-primary"><i class="icon-settings"> </i></div>
+                 </li>
+                 <li><i class="view-html fa fa-code font-primary"></i></li>
+                 <li><i class="icofont icofont-maximize full-card font-primary"></i></li>
+                 <li><i class="icofont icofont-minus minimize-card font-primary"></i></li>
+                 <li><i class="icofont icofont-refresh reload-card font-primary"></i></li>
+                 <li><i class="icofont icofont-error close-card font-primary"></i></li>
+               </ul>
+             </div>
+           </th>
+         </tr>
+       </thead>
+       <tbody>
+         <tr>
+           <td>
+             <div class="media">
+               <img class="img-fluid rounded-circle" src="../assets/images/dashboard/product-1.png" alt="" data-original-title="" title="">
+               <div class="media-body">
+                 <span>Yellow New Nike shoes</span>
+               </div>
+             </div>
+           </td>
+           <td>
+             <p>16 August</p>
+           </td>
+           <td>
+             <p>54146</p>
+           </td>
+           <td>
+             <img class="img-fluid" src="../assets/images/dashboard/graph-1.png" alt="" data-original-title="" title="">
+           </td>
+           <td>
+             <p>$210326</p>
+           </td>
+           <td>
+             <p>Done</p>
+           </td>
+         </tr>
+         <tr>
+           <td>
+             <div class="media">
+               <img class="img-fluid rounded-circle" src="../assets/images/dashboard/product-2.png" alt="" data-original-title="" title="">
+               <div class="media-body">
+                 <span>Sony Brand New Headphone</span>
+               </div>
+             </div>
+           </td>
+           <td>
+             <p>2 October</p>
+           </td>
+           <td>
+             <p>32015</p>
+           </td>
+           <td>
+             <img class="img-fluid" src="../assets/images/dashboard/graph-2.png" alt="" data-original-title="" title="">
+           </td>
+           <td>
+             <p>$548526</p>
+           </td>
+           <td>
+             <p>Done</p>
+           </td>
+         </tr>
+         <tr>
+           <td>
+             <div class="media">
+               <img class="img-fluid rounded-circle" src="../assets/images/dashboard/product-3.png" alt="" data-original-title="" title="">
+               <div class="media-body">
+                 <span>Beautiful Golden Tree plant</span>
+               </div>
+             </div>
+           </td>
+           <td>
+             <p>21 March</p>
+           </td>
+           <td>
+             <p>12548</p>
+           </td>
+           <td>
+             <img class="img-fluid" src="../assets/images/dashboard/graph-3.png" alt="" data-original-title="" title="">
+           </td>
+           <td>
+             <p>$589565</p>
+           </td>
+           <td>
+             <p>Done</p>
+           </td>
+         </tr>
+         <tr>
+           <td>
+             <div class="media">
+               <img class="img-fluid rounded-circle" src="../assets/images/dashboard/product-4.png" alt="" data-original-title="" title="">
+               <div class="media-body">
+                 <span>Marco M Kely Handbeg</span>
+               </div>
+             </div>
+           </td>
+           <td>
+             <p>31 December</p>
+           </td>
+           <td>
+             <p>15495</p>
+           </td>
+           <td>
+             <img class="img-fluid" src="../assets/images/dashboard/graph-4.png" alt="" data-original-title="" title="">
+           </td>
+           <td>
+             <p>$125424 </p>
+           </td>
+           <td>
+             <p>Done</p>
+           </td>
+         </tr>
+         <tr>
+           <td>
+             <div class="media">
+               <img class="img-fluid rounded-circle" src="../assets/images/dashboard/product-5.png" alt="" data-original-title="" title="">
+               <div class="media-body">
+                 <span>Being Human Branded T-Shirt</span>
+               </div>
+             </div>
+           </td>
+           <td>
+             <p>26 January</p>
+           </td>
+           <td>
+             <p>56625</p>
+           </td>
+           <td>
+             <img class="img-fluid" src="../assets/images/dashboard/graph-5.png" alt="" data-original-title="" title="">
+           </td>
+           <td>
+             <p>$112103</p>
+           </td>
+           <td>
+             <p>Done</p>
+           </td>
+         </tr>
+       </tbody>
+     </table>
+   </div>
+ </div>
+</div>
+
+
+
+
+
+
+
+
+
+
+
+
+
User Activations
+
+

Yearly User 24.65k

+
+
+
    +
  • +
    +
  • +
  • +
  • +
  • +
  • +
  • +
+
+
+
+
+
+
+ +
<div class="card">
+   <div class="card-header">
+     <div class="header-top d-sm-flex align-items-center">
+       <h5>User Activations</h5>
+       <div class="center-content">
+         <p>Yearly User 24.65k</p>
+       </div>
+       <div class="setting-list">
+           <ul class="list-unstyled setting-option">
+             <li>
+               <div class="setting-primary">
+                 <i class="icon-settings"></i>
+               </div>
+             </li>
+             <li>
+               <i class="view-html fa fa-code font-primary"></i>
+             </li>
+             <li>
+               <i class="icofont icofont-maximize full-card font-primary"></i>
+             </li>
+             <li>
+               <i class="icofont icofont-minus minimize-card font-primary"></i>
+             </li>
+             <li>
+               <i class="icofont icofont-refresh reload-card font-primary"></i>
+             </li>
+             <li>
+               <i class="icofont icofont-error close-card font-primary"></i>
+             </li>
+           </ul>
+       </div>
+     </div>
+   </div>
+   <div class="card-body p-0">
+     <div id="user-activation-dash-2"></div>
+   </div>
+</div>
+
+
+
+
+
+
+
+
+
Transaction
+
+

5878 Suceessfull Transaction

+
+
+
    +
  • +
    +
  • +
  • +
  • +
  • +
  • +
  • +
+
+
+
+
+

$2,09,352k 98.54%

+

Total Balance

+
+
+
+
+ +
<div class="card trasaction-sec">
+ <div class="card-header">
+   <div class="header-top d-sm-flex align-items-center">
+     <h5>Transaction</h5>
+   <div class="center-content">
+     <p>5878 Suceessfull Transaction</p>
+   </div>
+   <div class="setting-list">
+     <ul class="list-unstyled setting-option">
+       <li>
+         <div class="setting-secondary">
+           <i class="icon-settings"> </i>
+         </div>
+       </li>
+       <li>
+         <i class="view-html fa fa-code font-secondary"></i>
+       </li>
+       <li>
+         <i class="icofont icofont-maximize full-card font-secondary"></i>
+       </li>
+       <li>
+         <i class="icofont icofont-minus minimize-card font-secondary"></i>
+       </li>
+       <li>
+         <i class="icofont icofont-refresh reload-card font-secondary"></i>
+       </li>
+       <li>
+         <i class="icofont icofont-error close-card font-secondary"></i>
+       </li>
+     </ul>
+   </div>
+ </div>
+</div>
+<div class="transaction-totalbal">
+ <h2> $2,09,352k 
+   <span class="ms-3">
+     <a class="btn-arrow arrow-secondary" href="javascript:void(0)">
+       <i class="toprightarrow-secondary fa fa-arrow-up me-2"></i>98.54%
+     </a>
+   </span>
+ </h2>
+ <p>Total Balance</p>
+</div>
+ <div class="card-body p-0">
+   <div id="chart-3dash"></div>
+ </div>
+</div>
+
+
+
+
+
+
+
+@endsection \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index c369524..7a0f90d 100755 --- a/routes/web.php +++ b/routes/web.php @@ -27,6 +27,7 @@ Route::middleware('auth')->group(function () { 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::get('/turmas/{id}', [TurmasController::class, 'detalhes'])->name('turmas.detalhes'); 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');